Veröffentlicht am 08-03-2019

Konsul-Uhren verstehen

Ein tiefer Einblick in das Innenleben von Watches in Consul.

gojek.jobs

Ich arbeite bei GOJEKs Zahlungs- und Finanzabteilung GO-PAY. Unsere Plattform besteht aus Hunderten von Mikrodiensten. GO-PAY verarbeitet fast die Hälfte aller Transaktionen in GOJEK. In dieser Größenordnung ist es von entscheidender Bedeutung, einen genau definierten und deterministischen Mechanismus zur Erkennung von Diensten zu haben.

Eine allgemeine Lösung für die Serviceerkennung ist die Verwendung eines verteilten Schlüsselwertspeichers wie Consul, Zookeeper oder Etcd, es sei denn, Sie haben Ihr System für die Bereitstellung des Service-Meshs vollständig konfiguriert (oder sagen Sie es neu). Wir haben unseren eigenen Service Discovery-Mechanismus mit Consul und Envoy Proxy erstellt (die Details und Gründe, warum wir dies getan haben, sind ein Thema für einen anderen Blog-Beitrag).

Eine der Hauptfunktionen von Consul ist die Uhr. In unserer Zeit mit Consul haben wir einiges darüber gelernt, wie Uhren intern funktionieren. Dieser Beitrag ist ein Versuch, einige unserer Erkenntnisse zu teilen.

Eine Übersicht über Service Discovery mit Consul

Wenn in unserem System eine neue Instanz eines Dienstes hochgefahren wird, registriert sie sich bei Consul und fügt eine Statusprüfung für den Status hinzu. Wenn eine Dienstinstanz ausfällt oder ordnungsgemäß heruntergefahren wird, meldet sie sich ebenfalls beim Consul ab. Jeder Service / Consumer, der mit einem anderen Service sprechen muss, erkennt seine aktuellen Instanzen aus dem Consul-Katalog und fügt eine Überwachung der Statusänderungen dieses Services hinzu.

Wie funktionieren Consul-Uhren eigentlich intern?

Consul hat keine native Watch-Implementierung wie Zookeeper auf Knoten. Die meisten Sprach-SDKs implementieren daher Watch außerhalb von Consul, indem sie die Consul-Funktion zum Blockieren von Abfragen verwenden. Viele Endpunkte wie Knoten, Zustand und Katalog unterstützen das Blockieren von Abfragen.

Wenn beispielsweise eine Überwachungsschleife des Typs "service" für den Zielservice foobar gestartet wird, wird beim ersten Aufruf ein API-Aufruf von / v1 / health / service / foobar? Index = 0 ausgeführt. Integritäts-API-Aufrufe werden auch an den Consul-Server umgeleitet (dies ist eine spezielle Implementierung der Raw / Catalog-API).

Als Teil dieser API-Antwort gibt der Consul-Server einen Header namens X-Consul-Index zurück. Dieser Wert wird in der internen Floßprotokolldatenstruktur durch ein Feld mit dem Namen modifyIndex dargestellt. Diese Kopfzeile gibt den Wert des Floßprotokollindex an, bei dem der letzte Schreibvorgang für diesen bestimmten Dienst erfolgreich angewendet und geredet wurde. Dies ist die aktuelle Version der angeforderten Ressource aus dem Consul-Katalog.

In diesem Sinne, sagen wir im Falle unseres Service-Auftrages, hat Consul den X-Consul-Index-Header-Wert zum ersten Mal als x1 zurückgegeben. Consul-SDKs speichern diesen Wert mit und führen das nächste Mal einen API-Aufruf von / v1 / health / service / foobar? Index = x1 in der Überwachungsschleife aus, um eine Änderung des Zustands von Service foobar zu erkennen.

Diese Blockierungsabfragen sind so beschaffen, dass sie keine Antwort zurückgeben, bis für diesen bestimmten Endpunkt ein modifyIndex größer als x1 vorhanden ist oder das Blockierungsabfragezeitlimit erreicht wird. Normalerweise ist dieses Zeitlimit sehr hoch (Standard: 5 Minuten. Siehe Blockieren von Abfragen). Wenn das Zeitlimit überschritten wird, gibt Consul die Antwort mit demselben Wert von index = x1 im X-Consul-Index-Header zurück.

Wenn eine Antwort auf solche Blockierungsabfragen empfangen wird, prüfen die Implementierungen von Consul SDKs nach einem zuvor bekannten Wert (in diesem Fall x1) gegen den neuen Wert, der im X-Consul-Index-Header zurückgegeben wird. Wenn der zurückgegebene Wert größer als der letzte bekannte Wert ist, gehen sie davon aus, dass sich an diesem Endpunkt etwas geändert hat, und rufen die Handler-Funktion dieser bestimmten Überwachung auf.

Es ist wichtig zu beachten, dass sie überhaupt nicht auf die Antwort der API achten, um zu entscheiden, ob die Handler-Funktion von Watch ausgelöst werden soll. Es basiert nur auf aufeinanderfolgenden X-Consul-Index-Headerwerten. Selbst wenn zwei aufeinanderfolgende Aufrufe von / v1 / health / service / foobar dieselbe Antwort zurückgaben, wird davon ausgegangen, dass sie unterschiedlich sind, wenn der Wert des X-Consul-Index-Headers in der zweiten Antwort größer als der erste ist.

Dies ist eine Erklärung, wie Uhren in Consul implementiert werden. Interessanterweise hat uns diese Art der Handhabung der X-Consul-Index-Header-Werte bei der Verwendung von Consul-Uhren im großen Maßstab einige Probleme verursacht (wir haben erwähnt, dass GO-PAY die größte Zahlungsplattform in Indonesien ist, oder?). Das ist eine faszinierende Geschichte und verdient einen eigenen Posten. Beobachte diesen Raum weiter!

Bei GOJEK zu arbeiten ist ein kontinuierlicher Lernprozess. Unsere gesamte On-Demand-Plattform wird von mehr als 250 Ingenieuren gebaut. Es reicht also zu sagen, dass wir viel Zeit darauf verwenden, die Funktionsweise zu verstehen. Wenn Sie Ihre smarts bei schwierigen Problemen lernen und anwenden möchten, bieten wir Ihnen gerne die Möglichkeiten dazu. Schauen Sie sich gojek.jobs an und lernen Sie mit uns

gojek.jobs

Siehe auch

Der Rabe | 20. März 2019 Marketing, Media & Tech ZusammenfassungDer ultimative Einsteiger-Leitfaden zur Spieleentwicklung in UnityData Science-Produktion: Vertrauen