2009-05-04 9 views
9

Estoy creando un servidor de red y estoy iniciando una gran cantidad de AppDomains en el servidor al que se envían las solicitudes. ¿Cuál será la forma más rápida de enviar una carga útil de solicitud a uno de los dominios de la aplicación para su procesamiento?Enviar matrices de bytes grandes entre AppDomains en el mismo proceso

  1. Lea la carga del socket en una matriz de bytes y maréquelo.
  2. Marshal la secuencia de la red (hereda de MarshalByRef) al AppDomain.
  3. Lea la carga útil. Decodifícalo en objetos. Mariscal los objetos decodificados.
  4. Use conductos con nombre para transferir la matriz de bytes.
  5. Use tomas de bucle invertido.
  6. ¿Tal vez hay una manera de ordenar la conexión de socket real?

La mayoría de decodificación crea objetos inmutables que se utilizan para determinar cómo cumplir con los clientes solicitan y el dominio de aplicación a continuación, crea una respuesta y mariscales de nuevo al dominio de aplicación de acogida, que lo envía de vuelta a través de la toma de corriente.

El método debería preferir menos memoria con menos CPU.

WCF no es una opción.

Respuesta

1

La comunicación binaria TCP es ciertamente rápida, no sé cuánto más rápido que las tomas sin procesar, que es probablemente la más rápida, pero una PIA real.

He ejecutado 1500 - 2000 req por segundo en producción utilizando HTTP binario remoto entre dos cuadros. En la misma caja, debe tener un alto rendimiento utilizando TCP o un canal de canalizaciones de nombres, dependiendo de los ciclos de CPU que lleve procesar los datos.

1

Si yo fuera usted, echaría un vistazo a cómo se implementa Cassini. Hace más o menos exactamente lo que estás diciendo.

En realidad, Cassini ha sido reemplazado por Webhost, que es el servidor web incorporado que ahora viene con Visual Studio. Eche un vistazo a this post en el blog de Phil Haack para obtener más información.

+0

Cassini escucha las conexiones en el AppDomain remoto. Parece que OP quiere escuchar en socket en el AppDomain predeterminado. –

1

Muy buena pregunta. Si llegara a este problema, probablemente usaría un Flujo de Memoria/Flujo Buffered y ordenaría el flujo en el Dominio de la Aplicación que consume el objeto para reducir el ordenamiento o la serialización de muchos gráficos de objetos que se crearon en un Dominio de Aplicación diferente.

Pero, de nuevo, parece que está duplicando casi por completo la funcionalidad de IIS, por lo que buscaría/reflector en el espacio de nombres System.Web.Hosting y vería cómo lo manejaban y su WorkerThreadPool etc ....

1

6. ¿Hay alguna manera de ordenar la conexión de socket real ?

6-th es IMO la mejor opción. El zócalo desde la perspectiva del proceso es solo un asa. AppDomains reside en un solo proceso. Eso significa que los appdomains pueden intercambiar manejadores de socket.

Si la ordenación de socket no funciona, puede intentar volver a crear el socket en otro dominio de aplicación. Puede usar DuplicateAndClose para hacer esto.

Si eso no funciona, debe realizar algunas pruebas de rendimiento para elegir el mejor método de transferencia de datos. (Elegiría canalizaciones con nombre o archivos asignados a memomry)

Cuestiones relacionadas