Cómo utilizar Node.js para crear un clúster distribuido
Entonces, ¿cómo lograr el desacoplamiento de llamadas del lado del servidor? En el plan de implementación, utilizamos una combinación de (Buffers de protocolo Node.js Zookeeper RabbitMQ) para lograr una gestión centralizada de la configuración:
1.
Como lenguaje de secuencias de comandos naturalmente asincrónico, Node.js utiliza modelos de E/S sin bloqueo y controlados por eventos para mejorar en gran medida la eficiencia de la investigación y el desarrollo, y es muy adecuado para aplicaciones en tiempo real con uso intensivo de datos que se ejecutan. en dispositivos distribuidos.
Utilizamos el método de rutina a través de la biblioteca Fibers para resolver el problema de las devoluciones de llamadas anónimas en la programación asincrónica de Node.js, convirtiendo la lógica de devolución de llamadas asincrónica en sincronización y al mismo tiempo satisfaciendo el deseo de los programadores de usar métodos sincrónicos para escribir de forma asincrónica. programas.
Consulte la introducción oficial: /laverdet/node-fibers
2.Búfers de protocolo, utilizados para definiciones de mensajes fuertemente restringidas.
Protocol Buffers es un formato de intercambio de datos independiente del idioma y la plataforma. Debido a que es un formato binario, la eficiencia de transmisión es mayor que XML y JSON y puede usarse para la comunicación de datos entre aplicaciones distribuidas o el intercambio de datos en entornos heterogéneos. Utilizamos principalmente Protocol Buffers para crear plantillas de la estructura del mensaje.
Consulte: /google/protobuf
3.Zookeeper realiza una gestión centralizada de la configuración.
El marco de servicios distribuidos de Zookeeper es un subproyecto de Apache Hadoop. En pocas palabras, Zookeeper = mecanismo de notificación del sistema de archivos. Se utiliza principalmente para resolver algunos problemas de gestión de datos que a menudo se encuentran en aplicaciones distribuidas, como: servicio de nombres unificado, servicio de sincronización de estado, gestión de clústeres, gestión de elementos de configuración de aplicaciones distribuidas, etc.
Lo que valoramos cuando usamos ZooKeeper es que no solo admite la alta disponibilidad del clúster, sino que también admite nodos persistentes, almacenamiento temporal de nodos y monitoreo de cambios de nodos. Utilizamos principalmente servicios de nombres, administración de configuración y administración de clústeres. proporciona. Entre ellos, la función de nodo temporal se utiliza para realizar el registro del servicio de nombres y la supervisión de cambios de nodo realiza una gestión de configuración centralizada.
Referencia: /
Algunos errores experimentados
Finalmente, es muy importante resumir la experiencia y evitar cometer los mismos errores. También hay algunos problemas técnicos. dejado atrás, debemos evitar estos obstáculos por nuestra cuenta. Los siguientes son algunos de los errores que encontramos en el proceso de creación del marco RPC:
Problemas de eficiencia de programación asincrónica (fibras)&; Problemas de pérdida de memoria de Node.js
Creación de aplicaciones complejas; En situaciones complejas, pueden ocurrir pérdidas de memoria en muchos lugares y también es necesario considerar los problemas de eficiencia de la programación asincrónica. Para resolver estos dos problemas, actualmente adoptamos principalmente los siguientes tres métodos para resolverlos:
a) El marco encapsula todas las comunicaciones de la red, y el lado comercial solo se centra en la lógica empresarial y mejora la eficiencia de la I + D;
b) Encapsule todas las llamadas a funciones asincrónicas en métodos síncronos a través de Fibers;
c) Elija bibliotecas de terceros con cuidado.
Seguimiento de registros en el marco asincrónico
El desorden de los registros de grabación del programa asincrónico no favorece el seguimiento de la ruta de la llamada de lógica empresarial. Para resolver este problema, numeramos cada instancia de Fiber empaquetando Fibers, imprimimos la identificación de Fiber en todas las salidas de registro para registrar la ruta de llamada asincrónica e implementamos el seguimiento de llamadas de solicitud con números de sesión entre módulos para resolver el problema desordenado de los registros.
Problemas de alta disponibilidad de RabbitMQ HA
Si necesita implementar la función de alta disponibilidad de RabbitMQ HA, hay dos formas de lograrlo: HA del lado del servidor y HA del cliente.
Se puede lograr alta disponibilidad en el lado del servidor utilizando LVS o HAProxy. La alta disponibilidad en el lado del cliente también es una opción, que puede reducir la complejidad arquitectónica y las dependencias jerárquicas. Vale la pena señalar que al implementar funciones de alta disponibilidad, recuerde habilitar la configuración de alta disponibilidad de la cola.
(/ha.html)
Las interrupciones de la red RabbitMQ HA provocan problemas de partición de nodos
La inestabilidad de la red provoca interrupciones de la red RabbitMQ HA, lo que a su vez provoca problemas de nodo. cuestión de partición. Para abordar este problema, es necesario agregar monitoreo de /api/nodes y abordar los problemas de partición de manera oportuna.
Para soluciones específicas, consulte: /partitions.html
Sesión de ZooKeeper caducada
Para el problema de caducidad de la sesión de ZooKeeper, debe prestar especial atención a Manejo de la desconexión del clúster de Zookeeper El procesamiento de reconexión posterior se debe a que si la lógica de reconexión no se maneja bien, todas las funciones que dependen de ZooKeeper no estarán disponibles.
Para soluciones específicas, consulte: http://wiki.apache.org/hadoop/ZooKeeper/FAQ
Conclusión
Después de la práctica de la aplicación, Parece que en la actualidad Node.js puede hacer casi todo lo que pueden hacer otros lenguajes de back-end. La función ES6 se ha lanzado oficialmente. Ahora algunas personas han comenzado a gritar "javascript: el mejor lenguaje de programación del mundo", pero yo no. No creo que todo el back-end pueda usarse por completo. Node.js sería una buena solución para implementarlo.
Este artículo menciona muchas ventajas de Node.js, como asincrónico, sin bloqueo y controlado por eventos, etc., pero también tiene algunas deficiencias, como que el proceso único predeterminado y el subproceso único no pueden utilizarse. Es probable que se produzcan errores en tiempo de ejecución con múltiples núcleos y tipos de scripts débiles, y debido a que es simple y fácil de usar, también dificulta el control de la calidad del código y también presenta requisitos más altos para los desarrolladores. Por lo tanto, según la experiencia personal, se recomienda utilizar Node.js para el control de lógica empresarial compleja. Si se trata de un negocio con rendimiento extremo, se recomienda utilizarlo en combinación con otras soluciones como C.