Lignum: verteilte Nachrichtenwarteschlange

Nov 24 2022
Zwischen all dem WFH-Fuzz und der isolierten Situation machte ich mich daran, verteilte Sperren mit Consul zu untersuchen, das einfache Testprogramm wurde bald zu einem Weg zum Aufbau einer verteilten Nachrichtenwarteschlange namens Lignum. Dies ist ein einführender Artikel zur Nachrichtenwarteschlange von Lignum.

Zwischen all dem WFH-Fuzz und der isolierten Situation machte ich mich daran, verteilte Sperren mit Consul zu untersuchen. Das einfache Testprogramm wurde bald zu einem Weg zum Erstellen einer verteilten Nachrichtenwarteschlange namens Lignum .

Lignum-Übersicht

Dies ist ein einführender Artikel zur Nachrichtenwarteschlange von Lignum.

Was ist ein verteiltes System?

Es gibt viele Definitionen da draußen, eine einfache Google-Suche wird zu mehreren Antworten führen. Ich kann ein verteiltes System als eine Sammlung autonomer oder individueller Programme oder Systeme definieren, die auf ein gemeinsames Ziel hinarbeiten.

Das heißt, mehrere Systeme, die durch verschiedene Kommunikationsmittel miteinander vernetzt sind, um einem gemeinsamen Zweck zu dienen. Es könnten Systeme sein, bei denen man nach Webseiten fragt und Webseiten anbietet. Für einen Endbenutzer mögen diese Systeme wie ein einziges erscheinen, aber es könnte Hunderte solcher Systeme geben, die miteinander kommunizieren, um die Aufgabe zu erledigen.

Was ist eine Nachrichtenwarteschlange?

System, das eine Warteschlangendatenstruktur für andere Dienste bereitstellt, um Nachrichten in FIFO-Reihenfolge zu lesen und zu schreiben.
Die Warteschlange ermöglicht es dem Erzeugerdienst, Nachrichten zu schreiben, und der Verbraucher asynchron zu konsumieren. Produzent und Konsument müssen sich nicht bewusst sein.

Nachrichtenwarteschlange

Zwei grundlegende Merkmale der Nachrichtenwarteschlange sind

  1. Topic
    Messages werden an den benannten Buffer gesendet, diese werden Topic genannt. Wir produzieren und konsumieren Botschaften zum Thema.
  2. Nachricht
    Dies ist die eigentliche Nachricht, die wir zum Thema schreiben, damit andere sie lesen können.

Was ist eine verteilte Nachrichtenwarteschlange?

Wenn wir eine Nachrichtenwarteschlange aufbauen, die in mehreren Knoten gehostet wird, die gemeinsam zusammenarbeiten, um als einzelne Einheit für andere Dienste zu dienen.

Es müssen mehrere Warteschlangen bereitgestellt werden, in denen Benutzernachrichten bereitgestellt werden

  1. Zuverlässigkeit und hohe Verfügbarkeit
  2. Fehlertoleranz
  3. Leistung
  4. Teilen der Leselast mit mehreren Knoten

Lignum wurde als Testprogramm gestartet, um das verteilte Sperren mit Consul session lock zu lernen , das sich in Richtung Nachrichtenwarteschlange zu drehen begann, als ich zu dieser Zeit an Kafka arbeitete.
Dies ist in Go geschrieben. Ich begann es mit testgetriebener Entwicklung im Hinterkopf, aber bald endete es in einem Chaos.

Lignum-Architektur

Lignum ist keine vollwertige Nachrichtenwarteschlange, es ist noch in Arbeit. Sie können

  • Nachrichten an Thema senden
  • Nachrichten vom Thema verbrauchen
  • Die Nachricht wird an alle Knoten repliziert, was bedeutet, dass jeder Knoten zum Lesen der Nachricht aus dem Thema verwendet werden kann
  • Nachrichten auf der Festplatte beibehalten
  • Lignum kann im Cluster-Modus betrieben werden, ohne dass eine spezielle Einrichtung erforderlich ist
  • Die Clusterverwaltung wird durch Consul mit seinen Sitzungssperren erleichtert
  • Jeder Knoten wird sich mit dem Konsul verbinden, um den Anführer zu erhalten. Wenn kein Anführer gefunden wird, wird einer der Knoten zum Anführer gewählt
  • Alle anderen Knoten registrieren sich als Follower des Leaders
  • Die an den Leader gesendete Nachricht wird an den Follower-Knoten repliziert
  • Es hat zwei Replikationsmodi
    a. WAL-Replikation
    b. Live-Replikation
  • Wenn der Anführer untergeht, wird einer der Gefolgsleute zum Anführer gewählt

Derzeit implementiert lignum zwei Modi der Replikationsstrategie.

  1. WAL-Replikation
  2. Live-Replikation.

WAL-Replikation

message.initial-szie-per-topicEine Protokolldatei wird für jedes Thema erstellt, wenn die Nachricht die in config( ) definierte Puffergröße überschreitet . .qwalLignum erstellt für jedes Thema eine WAL-Datei ( ). Wenn die Nachrichtenanzahl die Puffergröße erreicht, wird diese Datei als logDatei auf die Festplatte geschrieben. Lignum überwacht häufig die Erstellung dieser Protokolldateien und sendet sie an die Follower. Alle Follower werden regelmäßig mit dem Leader synchronisiert, was für eine eventuelle/verzögerte Konsistenz sorgt.

Live-Replikation

Dies ist eine Streaming-Replikation, wenn der Follower bereits beim Leader registriert ist, müssen wir uns keine Gedanken über die Synchronisierung der Nachrichten machen, wenn das Thema danach erstellt wurde. Wir können die im Leader empfangenen Nachrichten einfach unverändert an den Follower weiterleiten. Bei dieser Strategie werden Nachrichten sofort an registrierte Follower gesendet. Auf diese Weise kann Lignum eine starke Konsistenz bieten.

So führen Sie Lignum aus

  • Voraussetzung
    – Consul
    Sie können Dockerfile wie in README angegeben verwenden
  • Klonen Sie das Repository
  • https://github.com/NishanthSpShetty/lignum.git
    

  • update config.yml, finden Sie in dieser Dokumentation weitere Einzelheiten zu Konfigurationen.
  • Laufmake run
  • Nachricht senden
  • 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
       }'
    

Welche Liefergarantie bietet es?
Da die Nachrichten gespeichert werden und der Verbraucher jederzeit alle Verrechnungen lesen kann, liegt die Liefergarantie beim Verbraucher. Das Lignum garantiert die Nachrichtenordnung.

Fügen wir dem vorhandenen Cluster einen Knoten hinzu

  • Ändern Sie die Konfiguration gemäß Ihrem Host.
  • Wenn die Ausführung auf demselben Host wie bei der vorherigen Ausführung erfolgt, ändern Sie die Werte für Port, Datenverzeichnis und Replikationsport in der Konfigurationsdatei.
  • Laufenmake run

Dies ist eine kurze Einführung in Lignum. Ich werde in Zukunft ein separates Dokument zu den Interna und Entwicklungsdetails erstellen.

Der Code befindet sich in Github: Lignum .

Auschecken und Feedback geben, Beiträge sind willkommen.

In meinem Github-Profil finden Sie weitere tolle Projekte, an denen ich arbeite

Verbinden Sie sich mit mir auf LinkedIn

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