HareGo: Wenn RabbitMQ Go trifft

Veröffentlicht

(Arsham Shirvani) (18. Dezember 2020)

Vorwort

Bei Blokur verwenden wir RabbitMQ für asynchron Kommunikation zwischen Mikrodiensten und zur Verwaltung von Arbeitsplätzen. Die AMQP -Bibliothek ist der De-facto-Standard für Go-Anwendungen. Sie ist jedoch sehr niedrig, was das Schreiben von flexiblem und testbarem Code erschwert.

In der Welt von Go gibt es eine Handvoll Bibliotheken auf hoher Ebene, die die Kommunikation mit RabbitMQ erleichtern. Leider haben sie nicht alle unsere Anwendungsfälle erfüllt, oder sie waren sehr spezifisch in Bezug auf das, was sie anbieten, was es uns sehr schwer gemacht hat, damit zu arbeiten. Deshalb haben wir beschlossen, eine eigene Bibliothek aufzubauen.

Wir brauchten etwas, an dem wir schnell anfangen konnten, um den wichtigsten Teil unserer täglichen Arbeit zu erledigen: das Lösen von Problemen. Alles in der Umgebung ist ein Entwicklungsaufwand und passt nicht in unser Modell.

Geben Sie HareGo ein.

Wir haben darüber nachgedacht, unser eigenes zu erstellen Bibliothek mit den folgenden Merkmalen:

  1. Sie sollte fast jeden Aspekt der AMQP-Bibliothek unterstützen.
  2. Muss gut getestet und leicht testbar sein.
  3. Muss einfach zu bedienen und erweiterbar sein.
  4. Sollte mit vernünftigen Standardeinstellungen ausgestattet sein, die nur funktionieren.
  5. Muss gleichzeitig sicher sein.
  6. Gut, um die Fähigkeit zu haben Nachrichten in die Warteschlange stellen (nicht nur Nack) und in der Lage sein, die Nachricht vor dem erneuten Einreihen in die Warteschlange zu stellen.

Wir freuen uns, Ihnen mitteilen zu können, dass wir diese Bibliothek als Open-Source-Version bereitgestellt haben. Zum Zeitpunkt des Schreibens dieses Artikels unterstützen wir die Go-Version 1.14 und höher.

API

Die Benutzeroberfläche von HareGo ist sehr einfach. Sie müssen ein harego.Client -Objekt mit dem praktischen harego erstellen. NewClient () -Funktion. Die einzigen Anforderungen der Funktion NewClient () sind die Adressen des RabbitMQ-Servers. Sie können jeden Aspekt des Clients und folglich des zugrunde liegenden AMQP-Clients konfigurieren, indem Sie harego.ConfigFunc Konfigurationsfunktionen, die von der Bibliothek bereitgestellt werden.

Standardmäßig ist ein harego.Client erstellt einen Worker, der jeweils eine Veröffentlichungs- oder eine Verbrauchsanforderung verarbeitet. Der Client erhält einen zufälligen Verbrauchernamen. Das Standardverhalten legt fest, dass autoDelete und autoAck Eigenschaften aller Nachrichten als falsch. Sie können sie jedoch auch anders einrichten, wenn Sie möchten.

Sie können die harego.Workers (3) Konfigurationsfunktion für 3 gleichzeitige Worker. Dies gilt für das Veröffentlichen und Konsumieren von Nachrichten. Die Bibliothek garantiert, dass die nächste verfügbare Nachricht an den nächsten verfügbaren Worker-Slot übermittelt wird.

Es ist eine gute Idee, eine harego.QueueName () config, um dem Client mitzuteilen, mit welcher Warteschlange er interagieren soll. Der Standardname der Warteschlange lautet „harego“.

Der Client ist eine Schnittstelle mit den folgenden Spezifikationen:

Veröffentlichen von Nachrichten

Zum Veröffentlichen von Nachrichten können Sie eine * amqp.Publishing Objekt für die Veröffentlichen Sie die -Methode. Die Nachricht wird vom nächsten verfügbaren Mitarbeiter verarbeitet.

Nachrichten verbrauchen

Die ist ein blockierender Aufruf, der jedes Mal einen Handler verwendet, wenn eine neue Nachricht vom Broker empfangen wird. Der Konsum wird beendet, wenn der Kontext abgebrochen oder der Client geschlossen wird.

Ein Handler sollte zwei Werte zurückgeben: AckType Wert und eine Verzögerung. Die Verzögerung gibt die Dauer an, in der der Ruhezustand erfolgen soll, bevor er auf den Broker antwortet, und der AckType-Wert gibt an, was mit der Nachricht geschehen soll.

AckType-Werte

Es wurde eine Entscheidung zum Festlegen der getroffen „Mehrfacher“ Wert der Bestätigung auf „falsch“, um bei mehreren Mitarbeitern nur auf eine Nachricht zu antworten. Damit das Worker-System funktioniert, müssen wir den Prefetch-Wert auf mindestens die Anzahl der Worker festlegen.

Für diesen Typ gibt es vier Werte:

  1. AckTypeAck : antwortet mit msg.Ack.
  2. AckTypeNack : antwortet mit msg.Nack.
  3. AckTypeReject : antwortet mit msg.Reject.
  4. AckTypeRequeue : Sendet die Nachricht zurück an die Warteschlange und antwortet mit msg.Ack. Weitere Informationen finden Sie im Abschnitt Nachrichten in die Warteschlange stellen.

Nachrichten in die Warteschlange stellen

Mit der AMQP-Bibliothek können Sie Nack Nachrichten und sie werden an den nächsten verfügbaren Verbraucher übermittelt. Manchmal ist dies nicht das, was Sie erwarten, und Sie benötigen die Nachricht, um zum Ende der Warteschlange zurückzukehren und erneut zugestellt zu werden. Mit HareGo ist dies nicht nur möglich, sondern Sie können die Nachricht auch vor dem erneuten Einreihen in die Warteschlange bearbeiten. Hier ist ein Beispiel für eine bis zu fünfmalige erneute Warteschlange.

Tipps und Tricks

Mehrere Verbindungen

Wenn Sie diese Bibliothek verwenden, erstellen Sie mehrere harego.Client zu adressierende Objekte verschiedene Aspekte Ihrer Logik. Angenommen, Sie lesen aus einer Warteschlange und schreiben in zwei Warteschlangen, erstellen drei Objekte und rufen die beiden Herausgeber im Consumer des ersten auf:

Testbarer Code

Um das Verspotten des harego.Client können Sie einen Funktionstyp erstellen, der einen neuen Client und einen Fehler zurückgibt. Sie können eine Mock-Generierungsbibliothek verwenden, um ein Mock aus der harego.Client -Schnittstelle zu erstellen und in Ihren Tests zu verwenden.

Im folgenden Snippet verwenden wir die Spottbibliothek zum Generieren der Mocks und bezeugen Bibliothek zum Durchsetzen von Verspottungen. Natürlich können Sie die Bibliothek auswählen, mit der Sie am besten vertraut sind.

Letzte Wörter

Weitere Informationen finden Sie im Repository der Bibliothek. Wenn Sie eine Funktionsanforderung benötigen oder ein Problem mit der Bibliothek gefunden haben, erstellen Sie ein Problem im Github-Portal.

Sie möchten sich unserer anschließen Mannschaft? Bitte gehen Sie zu diesem Link und bewerben Sie sich.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.