2012-02-21 6 views
5

tengo arquitectura de la aplicación de varias capas que tiene 4 partes:¿Cuál es la solución más ligera a la creación de una arquitectura multiproceso con el estado comparte a través de todos los procesos

  • una capa de servidor de red/cliente
  • Un intermedio capa de datos para manejar interacciones entre los procesos
  • Una capa de monitoreo
  • Una capa de cliente formado por un número n de instancias

Cliente capa/Servidor:

La capa de cliente/servidor gestiona las comunicaciones de red asíncronos con otro ordenador implementa mediante una capa personalizada 2 protocolo. Debido a las restricciones de diseño integradas en las comunicaciones, necesita permanecer independiente y poder sondear/enviar datos a la capa de datos de forma asincrónica.

capa intermedia:

La capa intermedia se implementa actualmente usando una base de datos. Una tabla contiene todas las etiquetas posibles a las que se puede llamar (aproximadamente 120,000). Una segunda tabla contiene un caché intermedio de la primera tabla que contiene solo los valores en uso, esto requiere actualizaciones constantes y se enjuaga cuando se solicita una nueva colección de elementos. La tercera tabla es donde se envían las actualizaciones de la colección y solo contiene datos cuando una solicitud está pendiente.

La capa Monitor:

La capa Monitor es una aplicación multi-hilo monolítico. Genera n cantidad de instancias de cliente en función de la cantidad de monitores conectados. Gestiona el estado global entre todas las instancias de cliente porque uno o más de ellos pueden compartir un estado similar/idéntico. Crea una lista única de valores necesarios, gestiona el envío de solicitudes de actualización cuando los clientes necesitan un conjunto diferente de etiquetas y gestiona las actualizaciones recurrentes.

Obviamente, esto no es ideal. Si una instancia falla, puede llevar el resto hacia abajo. Lo que me gustaría hacer es eliminar la capa intermedia, reemplazarla con la capa del monitor y hacer que todos los objetos se desarrollen como subprocesos del proceso del monitor para que puedan reaparecer a voluntad si algo sale mal (por ejemplo, el latido de las comunicaciones se detiene, el cliente se cuelga , etc.)

La base de datos parece demasiado pesada y no lo suficientemente especializada como para manejar el IPC (Inter Process Communications). El programa fue escrito bajo limitaciones de tiempo extremas, por lo que utilizar una base de datos era la "solución fácil" con la expectativa de que cambiaría en el futuro. Soy un gran admirador de la robustez de Google Chrome's multi-process architecture, pero sé muy poco acerca de cómo unen todos los procesos (pipes, tcp,?).

Así:

  1. podría esperar una mejora significativa del rendimiento del uso de IPC sobre una base de datos para la capa intermedia?

  2. ¿Qué forma de IPC sería ideal en un sistema Windows?

  3. ¿Existe una solución alternativa multiplataforma (léase Linux) disponible que podría utilizarse en su lugar si el desarrollo se trasladara a Mono?

  4. ¿Dónde puedo encontrar recursos/ejemplos para empezar?

Nota: entiendo que la arquitectura de este sistema parece innecesariamente complejo, pero existe como un front-end para un sistema mucho más grande. Esta aplicación también es de misión crítica, por lo que la estabilidad supera la eficiencia.

Actualización:

Me olvidé de mencionar en la pregunta inicial. El índice/datos de la base de datos se carga directamente desde un ramdisk en el arranque. La base de datos en sí misma ha sido indexada para un rendimiento óptimo. Las tablas o los valores que requieren escrituras frecuentes no están indexados, pero sí el resto de los datos.

Estoy buscando una alternativa para medir en contra porque la optimización de la base de datos se ha llevado a su límite y creo que todavía hay mucho margen de mejora.

Voy a subir algunos diagramas de la arquitectura tan pronto como tenga tiempo para dibujarlos.

+0

Un diagrama podría ser útil si tiene uno? –

+0

@MylesMcDonnell Añadiré uno tan pronto como lo redacte. Estoy un poco oxidado en esa área, así que podría llevar un tiempo. –

Respuesta

4
  1. Sí. La base de datos probablemente involucra el disco duro, y el disco duro es la parte más lenta de cualquier computadora, por lo que cambiar de usar el disco duro probablemente tendrá beneficios de rendimiento.

  2. Me gustaría ir con zeromq/zmq. Es un marco orientado a mensajes que admite varios patrones de comunicación. Por ejemplo PUB/SUB o REQ/REP etc. Más ejemplos here

  3. zmq es multiplataforma y es increíblemente rápido.

  4. Some C# examples on github

+0

Olvidé mencionar que la base de datos se ejecuta desde un ramdisk. –

+0

+1 muy interesante. Esta es la primera vez que escucho sobre ZMQ. Se parece mucho a la programación del socket pero más simple y más poderosa. Me llevará algo de tiempo leer más, pero definitivamente parece una opción viable. –

0

Me gustaría considerar el mirar en una solución basada Actor Modelo, como Akka.NET.

Cuestiones relacionadas