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í:
podría esperar una mejora significativa del rendimiento del uso de IPC sobre una base de datos para la capa intermedia?
¿Qué forma de IPC sería ideal en un sistema Windows?
¿Existe una solución alternativa multiplataforma (léase Linux) disponible que podría utilizarse en su lugar si el desarrollo se trasladara a Mono?
¿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.
Un diagrama podría ser útil si tiene uno? –
@MylesMcDonnell Añadiré uno tan pronto como lo redacte. Estoy un poco oxidado en esa área, así que podría llevar un tiempo. –