Actualmente estamos trabajando en nuestro nuevo producto / proyecto, es una aplicación cliente-servidor dirigida a ciertas empresas industriales / de servicios específicas. Estamos construyendo un servidor (lenguaje C y Linux solamente) que ejecuta un protocolo personalizado sobre TCP con un front-end Java. Estamos aproximadamente al 20% en el trabajo de codificación y nos enfrentamos a una situación en la que tenemos que elegir entre arquitectura de kernel micro o monolítica.
Soy consciente de que Micro vs. Monolithic generalmente está relacionado con la arquitectura del kernel, pero estamos hablando específicamente de servidores.
¿Por qué un servidor personalizado y no algo existente?
- Nuestras necesidades de IU son significativas y muy dinámicas, por lo que las soluciones basadas en Web / navegador web no eran apropiadas.
- El procesamiento estadístico es significativo en el extremo del cliente y, por lo tanto, nuevamente, los navegadores fueron de poca ayuda. (Por supuesto, podríamos hacer el procesamiento en el extremo del servidor y pasar los datos procesados al cliente, pero eso implicaría una gran carga en el servidor y el desperdicio de recursos del cliente).
- Además, con al menos tres tecnologías (JS / HTML / CSS) para administrar incluso un solo evento, hace que toda la experiencia sea como barrer la casa en medio de una tormenta del desierto: lo barres n veces, el polvo se acumula n + 1 veces.
¿Qué pasa con el servidor micro y monolítico? ¿De qué hablas?
Considere la siguiente solicitud (hipotética) del cliente:
request-id: 123
request-service: HistoricDataSets
request-message: Fetch all records upto the year 2010
Al recibir dicha solicitud, un servidor, por lo general, lo hace (estamos ignorando las técnicas de concurrencia, como el subproceso y los tenedores por simplicidad):
- Analiza la cadena de solicitud
- Identificar la acción (Fetch
HistoricDataSets LIMIT Year (2010)
en nuestro caso) - Interactúe con la capa de persistencia (Oracle, digamos, en nuestro ejemplo) y obtenga los datos.
Formatee los datos según el protocolo. Ex:
respuesta-id: 123
éxito:
texto de respuesta verdadero : conjuntos de datosResponda al cliente con los datos así formateados.
Esto es lo que llamamos un servidor monolítico (similar a un núcleo monolítico donde todos los trabajos del sistema operativo se realizan en el espacio del núcleo).
Considere la misma solicitud nuevamente, al recibo, esta vez el servidor (asumimos solo la memoria compartida como IPC, nuevamente por simplicidad):
- Pone la solicitud en la memoria compartida para el
Parser
proceso. - El
Parser
análisis sintáctico de la cadena, se identifica la tarea y dirige elExecutioner
proceso para ejecutar las tareas. - La
Executioner
entonces pasa los datos alFomatter
proceso que, después de formatear los datos en una cadena de protocolo, vuelve al servidor. - El servidor lo envía al cliente (respuesta).
Por supuesto, en lugar de Parser
, Executioner
y Formatter
podría haber sido un proceso único pero separado. Esto es lo que llamamos un Micro Server (similar a un micro kernel que apenas requiere lo mínimo). El servidor efectivamente solo está escuchando y respondiendo, mientras que todos los pasos son atendidos por diferentes procesos.
¿Cuál elegir? ¡Estamos confundidos! Si bien los servidores monolíticos se prueban y prueban (¿la mayoría de los servidores web HTTP?) Y son más fáciles de programar y pueden manejar la concurrencia bastante bien. Los micro servidores, prima facie, parecen rápidos y en línea con el principio UNIX de un programa para hacer una tarea, pero también son complicados de desarrollar, especialmente. teniendo en cuenta la concurrencia.
Pregunta (s)
- ¿Cuáles son (posiblemente podrían ser) los pros y los contras de cada enfoque?
- ¿Cuándo usar cuál? (También podría interpretarse como una pregunta general: ¿Cuándo usar IPC?)
- Si se elige Micro kernel, ¿qué funciones deben ser parte del servidor central y qué no?
Preguntas similares / relacionadas
- Peligros de gran aplicación monolítica.
- Navegador externo externo incrustado (tangencial)
- Consejos para convertir la aplicación monolítica en multiproceso (tangencial)
Alguna información que puede ser útil:
- Nuestros clientes potenciales se pueden dividir en dos categorías:
- Grande: alrededor de 1,700 - 2,000 solicitudes por minuto
- Pequeño: alrededor de 650 - 700 solicitudes por minuto
- Se puede suponer que el volumen de datos por ciclo de solicitud (solicitud y la respuesta posterior) se distribuye normalmente con una media de ~ 1.20 MB y, en el peor de los casos, alrededor de 250-300 MB.
- El concepto del producto es relativamente nuevo, pero tiene la capacidad de afectar las operaciones centrales, por lo tanto, esperamos que los presupuestos de los clientes sean flexibles solo después de un cierto retraso (9-12 meses) después de la implementación, esto limita la cantidad de hardware que el cliente estará dispuesto cometer esp. los pequeños
- Cada cliente tendrá su propia pila cliente-servidor. El servidor se ejecutará en el hardware del cliente administrado por el equipo del cliente, mientras que los clientes se implementarán en las máquinas de los empleados funcionales.
- Las actualizaciones remotas para el cliente y la aplicación del servidor son imprescindibles
- Los
PUSH
servicios en tiempo real del servidor pueden ser 'altamente' deseados si el producto hace clic.