node.js redis socket.io rabbitmq scalability

node.js - Escale Socket.io vertical y horizontalmente: ¿cuál es el camino “correcto” para ir?



redis rabbitmq (1)

Yo diría que Kafka es un buen ajuste para la escala horizontal. Es una forma bastante sofisticada de distribuir una gran cantidad de eventos entre servidores (que al final es lo que desea). Esta es una buena lectura al respecto: https://engineering.linkedin.com/kafka/running-kafka-scale

Con respecto a la escala vertical, en lugar de socket.io-clusterhub usaría algo llamado PM2 ( https://github.com/Unitech/pm2 ) que le permite cambiar el tamaño de la escala de las aplicaciones en cada computadora dinámicamente, así como controlar la Registros e informes a keymetrics.io (si lo está utilizando).

Si necesita algún fragmento, pregúnteme y editaré la respuesta, pero en el github PM2 hay muy pocos.

Quiero escalar mi aplicación Node.js Socket vertical y horizontalmente y todavía no he encontrado una solución sofisticada.

Mi aplicación tiene dos casos de uso:

  1. Transmite mensajes de un usuario a todos los demás.
  2. Envíe mensajes de un usuario a un subconjunto de usuarios

Por un lado, he leído que necesito Redis para ambos casos junto con socket.io-redis

Por otro lado, he visto este video y leí esta respuesta SO donde dice que Redis no es confiable y no se garantiza que los mensajes publicados llegarán , por lo que solo debes usarlo para agrupamiento / escala vertical

La solución de Microsoft Azures para usar ServiceBus está fuera de discusión, porque no quiero usar Azure.

En lugar de Redis, el chico recomienda usar RabbitMQ para la escala horizontal.

Para la escala vertical también existe socket.io-clusterhub , un IPC para procesos de nodo, pero parece funcionar solo en Socket.io <= v0.9.0

Luego está este tipo , que ha implementado su propio método para pasar mensajes a otros nodos a través de solicitudes HTTP, lo que de alguna manera tiene sentido. Pero, ¿por qué HTTP solicita que también pueda establecer conexiones de socket directas entre servidores, enviar el mensaje a todos los servidores simultáneamente y superar el retraso de pasar de un servidor a otro?

Como conclusión, pensé que podría ir con Redis en CADA servidor, solo para el intercambio de mensajes al agrupar mi aplicación en múltiples procesos, junto con RabbitMQ como una solución de comunicación S2S .

Pero parece un poco excesivo tener un Redis por servidor y otro RabbitMQ central.

¿Existe alguna solución mejor, más corta / mejor conocida, para escalar Socket.io de manera confiable en ambas direcciones?

EDITAR: he intentado usar un único servidor Redis para varios servidores Node.js, donde cada uno de ellos utiliza la agrupación en clúster a través de sticky-session en todos los núcleos. Si bien el agrupamiento en clúster en sí mismo funciona como un encanto con redis, parece haber un problema cuando se usan varios servidores. Los mensajes no llegarán a los otros nodos .