Lignum: cola de mensajes distribuidos

Nov 24 2022
En medio de toda la confusión de WFH y la situación aislada, me dispuse a buscar bloqueos distribuidos usando Consul, el programa de prueba simple pronto se convirtió en un camino para construir una cola de mensajes distribuidos llamada Lignum. Este es un artículo de introducción a la cola de mensajes de Lignum.

En medio de toda la confusión de WFH y la situación aislada, me dispuse a buscar bloqueos distribuidos usando Consul, el programa de prueba simple pronto se convirtió en un camino para construir una cola de mensajes distribuidos llamada Lignum .

Resumen de Lignum

Este es un artículo de introducción a la cola de mensajes de Lignum.

¿Qué es un sistema distribuido?

Hay muchas definiciones por ahí, una simple búsqueda en Google dará como resultado múltiples respuestas. Puedo definir un sistema distribuido como una colección de programas o sistemas autónomos o individuales que trabajan hacia un objetivo común.

Es decir, múltiples sistemas conectados en red por varios medios de comunicación para servir a un propósito común. Pueden ser sistemas donde uno pide página web y uno sirve páginas web. Para un usuario final, estos sistemas pueden parecer uno solo, pero podría haber cientos de estos sistemas, que se comunican entre sí para realizar la tarea.

¿Qué es la cola de mensajes?

Sistema que proporciona una estructura de datos de cola para que otro servicio lea y escriba mensajes en orden FIFO.
La cola permite que el servicio del productor escriba el mensaje y que el consumidor lo consuma de forma asíncrona. El productor y el consumidor no necesitan ser conscientes el uno del otro.

cola de mensajes

Dos características básicas de la cola de mensajes son

  1. Los mensajes de tema
    se envían al búfer nombrado, estos se denominan tema. Producimos y consumimos mensajes del tema.
  2. Mensaje
    Este es el mensaje real que escribimos en el tema para que otros lo consuman.

¿Qué es la cola de mensajes distribuidos?

Cuando construimos una cola de mensajes que se alojan en varios nodos, trabajan colectivamente para servir como una sola entidad para otros servicios.

Habrá múltiples mensajes de usuario de alojamiento de cola para proporcionar

  1. Confiabilidad y alta disponibilidad
  2. Tolerancia a fallos
  3. Rendimiento
  4. Compartir carga de lectura con múltiples nodos

Lignum se inició como un programa de prueba para aprender el bloqueo distribuido utilizando el bloqueo de sesión de Consul , que comenzó a girar hacia la cola de mensajes mientras trabajaba en Kafka en ese momento.
Esto está escrito en Go. Lo comencé con el desarrollo basado en pruebas en mente, pero pronto terminó siendo un desastre.

Arquitectura Lignum

Lignum no es una cola de mensajes completa, es un trabajo en progreso. Usted puede

  • Enviar mensajes al tema
  • Consumir mensajes del tema
  • El mensaje se replica en todos los nodos, lo que significa que se puede usar cualquier nodo para leer el mensaje del tema
  • Persistir mensajes en el disco
  • Lignum puede operar en modo clúster sin necesidad de ninguna configuración especial
  • Consul facilita la gestión de clústeres con sus bloqueos de sesión
  • Cada nodo se conectará a Cónsul para obtener el líder. Si no se encuentra un líder, uno de los nodos será elegido como líder.
  • Todos los demás nodos se registrarán como seguidores del líder.
  • El mensaje enviado al líder se replicará en el nodo seguidor
  • Tiene dos modos de replicación
    a. replicación WAL
    b. replicación en vivo
  • Si el líder cae, cualquiera de los seguidores es elegido líder.

Actualmente, lignum implementa dos modos de estrategia de replicación.

  1. replicación WAL
  2. Replicación en vivo.

replicación WAL

El archivo de registro se crea para cada tema cuando el mensaje sobrepasa el tamaño del búfer definido en config( message.initial-szie-per-topic). Lignum crea un archivo WAL( .qwal) para cada tema. Cuando el recuento de mensajes alcanza el tamaño del búfer, este archivo se descarga en el disco como logarchivo. Lignum observa con frecuencia la creación de estos archivos de registro y los envía a los seguidores. Todos los seguidores se sincronizan periódicamente con el líder, lo que brinda consistencia eventual/retrasada.

replicación en vivo

Esta es una replicación de transmisión, cuando el seguidor ya está registrado con el líder, no debemos preocuparnos por sincronizar los mensajes si el tema se creó después. Podemos reenviar los mensajes recibidos en el líder tal cual al seguidor. En esta estrategia, los mensajes se envían al seguidor registrado de inmediato. De esta manera, Lignum puede proporcionar una fuerte consistencia.

Cómo ejecutar Lignum

  • Requisito previo
    : Cónsul
    Puede usar Dockerfile como se especifica en README
  • Clonar el repositorio
  • https://github.com/NishanthSpShetty/lignum.git
    

  • update config.yml, puede consultar esta documentación para obtener más detalles sobre las configuraciones.
  • corrermake run
  • Enviar mensaje
  • curl --request POST \
      --url http://localhost:8080/api/message \
      --header 'Content-Type: application/json' \
      --data '{
       "topic": "test",
       "message":"this is a test message"
       }'
    

    curl --request GET \
      --url http://localhost:8080/api/message \
      --header 'Content-Type: application/json' \
      --data '{
       "topic": "test",
       "from": 0,
       "to": 3
       }'
    

¿Qué garantía de entrega ofrece?
Como los mensajes persisten y el consumidor puede leer cualquier desplazamiento en cualquier momento, la garantía de entrega recae en el consumidor. El Lignum garantiza el ordenamiento de los mensajes.

Agreguemos un nodo al clúster existente

  • Cambie la configuración según su host.
  • Si se ejecuta en el mismo host que la ejecución anterior, cambie el puerto, el directorio de datos y los valores del puerto de replicación en el archivo de configuración.
  • Corrermake run

Esta es una breve introducción a Lignum. Presentaré un documento separado sobre sus detalles internos y de desarrollo en el futuro.

El código está en Github: Lignum .

Pague y proporcione comentarios, las contribuciones son bienvenidas.

Consulte mi perfil de Github para ver otros proyectos increíbles en los que estoy trabajando

Conéctate conmigo en LinkedIn

https://www.linkedin.com/in/nishanthspshetty/