¿Cómo se distribuye un pub / subsistema?

Al crear un sistema distribuido tolerante a fallas en cualquier momento, debe agregar la entrega tolerante a fallas en varios lugares, en la biblioteca utilizada por el productor y el consumidor, así como en la capa de intermediario. Apache Kafka se creó para resolver estos problemas y, a partir de la versión 0.8, lo hace de forma eficaz (baja latencia). Neha Narkhede dio una buena charla tecnológica sobre las características de Kafka 0.8 en LinkedIn, pero no sé si ese video o uno similar está disponible públicamente.

Para simplificar la imagen, imagine que tiene 1 tema con 1 fragmento y 3 corredores (es decir, 3 réplicas). Cada corredor debe ver cada mensaje mientras está vivo. La parte “viva” es importante, porque los corredores pueden fallar o simplemente reiniciarse por mantenimiento. Mientras eso sucede, el clúster aún debe funcionar ya que se está ejecutando un quórum (2 corredores).

Esencialmente, cuando un productor publica un mensaje, el productor no debe recibir un ACK de que su mensaje se publicó con éxito hasta que un quórum (mayoría) de servidores de intermediario reciba el mensaje y lo confirme.

Los servidores de los corredores deben tener un algoritmo en ejecución para sincronizar los mensajes, de modo que eventualmente todos los corredores en vivo vean todos los mensajes.

La biblioteca del consumidor debe poder conectarse a cualquier corredor en cualquier momento y recibir mensajes sobresalientes. En este caso, dado que solo hay un fragmento, el consumidor debe leer todos los mensajes en orden. Esto significa que no puede omitir un mensaje: esta es la detección de brecha de llamada y es una propiedad necesaria de dicho sistema.

Entonces, para responder a su pregunta, el corredor supone que cualquier consumidor puede conectarse a cualquier máquina en cualquier momento. Por lo tanto, el nivel de intermediario debe asegurarse de que sus algoritmos de “sincronización” aseguran que cada réplica de intermediario reciba cada mensaje en orden. La única relajación es que algunas réplicas de corredores podrían estar rezagadas de otros corredores.

Espero que esto ayude.

Una forma típica (pero no la única) de distribuir la carga es hacer que cada tema en el sistema sea manejado por un solo servidor (o, bueno, tener redundancia, un par de servidores, pero simplifiquemos eso). Luego, todos los clientes que estén interesados ​​en el tema se conectan al servidor y se suscriben a publicaciones sobre el tema. Con este modelo muy simple, en su ejemplo, si el tema es manejado por el Servidor 1, entonces la publicación va allí, pero también todos los suscriptores deben estar conectados al Servidor 1. Para averiguar qué servidor obtiene qué tema generalmente se hace usando hashing consistente o una tabla hash distribuida.

Ahora, este sistema simple significaría que los suscriptores interesados ​​en muchos temas deben conectarse a muchos lotes de servidores, y los servidores deben mantener bastante estado (a corto plazo) en todas las suscripciones. Una forma de lidiar con eso es introducir agregadores, un conjunto diferente de servidores. Cada cliente se conecta a un único agregador y le dice al agregador en qué temas está interesado. Luego, el agregador se conecta a los servidores apropiados en nombre del cliente, configura suscripciones y reenvía los eventos recibidos. Si varios clientes están interesados ​​en el mismo tema, conéctese al mismo agregador, el servidor solo necesita enviar el mensaje una vez, y el agregador puede reenviarlo.

Esta respuesta fue quizás un poco larga, pero si realmente quieres profundizar, tenemos un documento sobre cómo y dónde ocurre el pub / sub en Spotify que está disponible en mi página de inicio académica, The Hidden Pub / Sub de Spotify (Artículo de la industria).

Distributed Pub / Sub System es un paradigma de comunicación que permite la libertad en el sistema distribuido mediante el desacoplamiento de las entidades de comunicación en términos de tiempo, espacio y sincronización.
Un sistema de servicio de eventos que es asíncrono, anónimo y poco acoplado.
Capacidad para adaptarse rápidamente en un entorno dinámico.
Modelo de corredor centralizado
¨Consiste en múltiples editores y múltiples suscriptores y corredores / corredores centralizados (una red superpuesta de corredores que interactúan entre sí).
¨Los suscriptores / editores se comunicarán con 1 corredor y no necesitan tener conocimiento de otros.
Modelo de igual a igual
¨Cada nodo puede ser editor, suscriptor o corredor.
¨ Los suscriptores se suscriben a los editores directamente y los editores notifican a los suscriptores directamente. Por lo tanto, deben mantener el conocimiento mutuo.
¨Complejo en su naturaleza, se emplean mecanismos como DHT y CHORD para localizar nodos en la red.
Lee mas

Busque fragmentos para obtener algunas ideas.

Manera trivial / fuerza bruta: reenviar todos los eventos de publicación a todos los servidores, hash ID de usuario a ID de servidor, el servidor mantiene información local sobre suscriptores conectados; Las solicitudes de suscripción se equilibran con la carga utilizando el hash.