Lignum : file d'attente de messages distribués

Nov 24 2022
Entre toutes les situations floues et isolées de la FMH, je me suis mis à examiner les verrous distribués à l'aide de Consul, le programme de test simple est rapidement devenu un moyen de créer une file d'attente de messages distribuée appelée Lignum. Ceci est un article d'introduction à la file d'attente de messages Lignum.

Entre toutes les situations floues et isolées de la FMH, je me suis mis à examiner les verrous distribués à l'aide de Consul, le programme de test simple est rapidement devenu un moyen de créer une file d'attente de messages distribuée appelée Lignum .

Aperçu de Lignum

Ceci est un article d'introduction à la file d'attente de messages Lignum.

Qu'est-ce qu'un système distribué ?

Il existe de nombreuses définitions, une simple recherche sur Google donnera plusieurs réponses. Je peux définir le système distribué comme un ensemble de programmes ou de systèmes autonomes ou individuels qui travaillent vers un objectif commun.

Autrement dit, plusieurs systèmes mis en réseau par divers moyens de communication pour servir un objectif commun. Il peut s'agir de systèmes où l'on demande une page Web et l'autre sert des pages Web. Pour un utilisateur final, ces systèmes peuvent apparaître comme un seul, mais il pourrait y avoir des centaines de tels systèmes, qui communiquent entre eux pour effectuer la tâche.

Qu'est-ce que la file d'attente des messages ?

Système qui fournit une structure de données de file d'attente pour que d'autres services lisent et écrivent des messages dans l'ordre FIFO.
La file d'attente permet au service producteur d'écrire un message et au consommateur de consommer de manière asynchrone. Le producteur et le consommateur n'ont pas besoin de se connaître.

file d'attente de messages

Deux caractéristiques de base de la file d'attente de messages sont

  1. Les messages de sujet
    sont envoyés au tampon nommé, ceux-ci sont appelés sujet. Nous produisons et consommons des messages à partir du sujet.
  2. Message
    C'est le message réel que nous écrivons au sujet pour que les autres le consomment.

Qu'est-ce que la file d'attente de messages distribuée ?

Lorsque nous construisons une file d'attente de messages qui sont hébergés dans plusieurs nœuds, travaillant collectivement ensemble pour servir d'entité unique pour d'autres services.

Il y aura plusieurs messages utilisateur d'hébergement de file d'attente à fournir

  1. Fiabilité et haute disponibilité
  2. Tolérance aux pannes
  3. Performance
  4. Partage de la charge de lecture avec plusieurs nœuds

Lignum a été lancé en tant que programme de test pour apprendre le verrouillage distribué à l'aide de Consul session lock , qui a commencé à pivoter vers la file d'attente de messages alors que je travaillais sur Kafka à l'époque.
Ceci est écrit en Go. Je l'ai commencé avec le développement piloté par les tests à l'esprit, mais cela a vite fini par être un gâchis.

Architecture Lignum

Lignum n'est pas une file d'attente de messages à part entière, c'est un travail en cours. Tu peux

  • Envoyer des messages au sujet
  • Consommer les messages du sujet
  • Le message est répliqué sur tous les nœuds, ce qui signifie que n'importe quel nœud peut être utilisé pour lire le message du sujet
  • Conserver les messages sur le disque
  • Lignum peut fonctionner en mode cluster sans nécessiter de configuration particulière
  • La gestion du cluster est facilitée par Consul avec ses verrous de session
  • Chaque nœud se connectera au Consul pour obtenir le leader. Si aucun leader n'est trouvé, l'un des nœuds sera élu leader
  • Tous les autres nœuds s'enregistreront en tant que suiveurs du leader
  • Le message envoyé au leader sera répliqué sur le nœud suiveur
  • Il a deux modes de réplication
    a. Réplication WAL
    b. Réplication en direct
  • Si le leader tombe, l'un des suiveurs est élu en tant que leader

Actuellement lignum met en œuvre deux modes de stratégie de réplication.

  1. Réplication WAL
  2. Réplication en direct.

Réplication WAL

Le fichier journal est créé pour chaque rubrique lorsque le message dépasse la taille de la mémoire tampon définie dans config( message.initial-szie-per-topic). Lignum crée un fichier WAL( .qwal) pour chaque sujet. Lorsque le nombre de messages atteint la taille de la mémoire tampon, ce fichier est vidé sur le disque en tant que logfichier. Lignum surveille fréquemment la création de ces fichiers journaux et les envoie aux abonnés. Tous les suiveurs sont synchronisés périodiquement avec le leader, offrant une cohérence éventuelle/retardée.

Réplication en direct

Il s'agit d'une réplication en streaming, lorsque le suiveur est déjà enregistré auprès du leader, nous n'avons pas à nous soucier de la synchronisation des messages si le sujet a été créé après. Nous pouvons simplement transférer les messages reçus dans le leader tel quel au suiveur. Dans cette stratégie, les messages sont envoyés immédiatement aux abonnés enregistrés. De cette façon, Lignum peut fournir une forte consistance.

Comment faire fonctionner Lignum

  • Prérequis
    — Consul
    Vous pouvez utiliser Dockerfile comme spécifié dans README
  • Cloner le référentiel
  • https://github.com/NishanthSpShetty/lignum.git
    

  • update config.yml, vous pouvez vous référer à cette documentation pour plus de détails sur les configurations.
  • Coursmake run
  • Envoyer le message
  • 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
       }'
    

Quelle garantie de livraison offre-t-il ?
Comme les messages sont conservés et que le consommateur peut lire n'importe quel décalage à tout moment, la garantie de livraison incombe au consommateur. Le Lignum garantit l'ordonnancement des messages.

Ajoutons un nœud au cluster existant

  • Modifiez la configuration selon votre hébergeur.
  • S'il s'exécute sur le même hôte que l'exécution précédente, modifiez les valeurs du port, du répertoire de données et du port de réplication dans le fichier de configuration.
  • Coursmake run

Ceci est une courte introduction à Lignum. Je proposerai un document séparé sur ses détails internes et de développement à l'avenir.

Le code est dans Github : Lignum .

Commander et fournir des commentaires, les contributions sont les bienvenues.

Consultez mon profil Github pour d'autres projets géniaux sur lesquels je travaille

Connectez-vous avec moi sur LinkedIn

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