Sondeo largo (notificación de usuario) con una architecture RESTful

Estoy trabajando en una simple API REST (en NodeJs). Entiendo que estar tranquilo implica que la escala horizontal será mucho más fácil. Desafortunadamente, necesito alguna forma para que los clientes sean notificados de ciertos eventos casi al instante. Por esta razón, estaba pensando en hacer encuestas largas. La pregunta que tengo es cómo funciona esto con múltiples servidores. Por ejemplo, aquí hay un caso de uso simplificado:

Both servers A and B are behind a common load balancer. User Alice posts a message on Bob's wall (PUT request on server A). If Bob is online, he should be notified instantly (long-polling on server B). 

¿Cómo puede el servidor A enviar una notificación a Bob o al servidor B saber que se debe notificar a Bob?

En primer lugar, no sé por qué no usaría algo como socket.io tanto en el cliente como en el servidor para manejar su canal de notificación. Usará sockets web si están disponibles (más eficientes que un sondeo largo) y luego retrocederá al sondeo largo si no hay sockets web.

Hay varias maneras de manejar el problema de notificar a un usuario que puede no estar conectado al servidor que origina la notificación:

Base de datos conectada

Cuando un usuario se conecta, la carga se balancea en un servidor aleatorio, pero el servidor al que terminan conectándose se almacena en una base de datos central (por ejemplo, tal vez un almacén de redis) desde el cual cualquiera de sus servidores puede averiguar en qué servidor está actualmente el usuario conectado a. Esto le da la posibilidad de buscar en qué servidor está conectado actualmente cualquier usuario. Cada servidor que maneja las conexiones de los usuarios simplemente agrega cada usuario a la base de datos con una referencia a su ID de servidor cuando se conectan y los elimina de la base de datos cuando el usuario se desconecta. Nota: dado que esta información no necesita almacenarse en el disco de forma persistente y el tamaño de los datos es pequeño, puede seleccionar una base de datos que sobresalga al mantener la mayor parte o toda la información en la memoria.

Conexión hash

Sobre la base de algunas características bien conocidas del usuario, como su ID de usuario, se calcula un valor de hash y se crea un algoritmo repetible para asignar valores de hash a través del grupo de servidores. Esta es una tarea predecible. Por lo tanto, cuando un servidor quiere notificar a Bob, pueden llamar a la misma función que determinará a qué servidor se ha conectado Bob. El algoritmo de hash puede ser adaptable, de modo que si hoy tiene tres servidores, los usuarios de hash se reparten de manera uniforme entre los tres servidores y si mañana tiene cuatro servidores, entonces los usuarios de hash se reparten de manera uniforme entre los cuatro servidores.

Multi-Conexión

Como los websockets de baja actividad son bastante escalables en estos días, todos los usuarios podrían conectarse a todos los servidores y, por lo tanto, cada servidor tendría una conexión de socket para el usuario. Esta es una infraestructura más simple, pero en última instancia no es tan escalable.

El enfoque de sondeo largo pone la carga en el cliente de realizar solicitudes periódicas, por lo que son solicitudes separadas. No hay “notificación al cliente” con sondeo largo. Las encuestas de clientes.

Puede usar el caché distribuido para almacenar la información de estado intermedio a la que A y B tendrán acceso. De este modo, los servidores A y B pueden participar en la conversación con el cliente porque todo se mantiene en esa memoria caché distribuida.

 Client Alpha Request 1 -> Node A =) Cache it as k,v (Aplha, State<-has request info) 

Mientras tanto, uno o más Nodos A, B, C o D trabajan en él y toman su propio tiempo.

 Client Alpha Request 2 -> Node B =) Retrieve Cache it as k,v (Aplha,State <-not done) (are we done yet?) 

Mientras tanto uno trabaja su obra. Su solicitud se cumple 🙂 es decir

Nodo X =) Actualizar caché (Aplha, Estado <- resultados)

 Client Alpha Request 2 -> Node B =) Retrieve Cache it as k,v (Aplha, State<-results) (are we done yet?) (here you Sir - your results are now ready) 

WebSockets: otra opción es ir a WebSockets en lugar de sondeo largo

  Connection between Client and Node A is persistent with bidirectional communication. 
    Intereting Posts