Marathon: Vereinfachen Sie den Wahlkodex für die Führung

Erstellt am 22. Dez. 2016  ·  7Kommentare  ·  Quelle: mesosphere/marathon

Jetzt, da wir für die Leader-Wahl auf LeaderLatch des Kurators migriert sind, scheint es, dass unser Leader-Wahlcode VIEL mehr tut als nötig. Einige Dinge, die ich gerne behoben sehen würde:

  • alle Sperren entfernen. Beispielsweise blockiert LeaderLatch und dies führte zu einem Deadlock. Bei der Menge an Thread-Blockierungen, die wir durchführen, sollte dies keine Überraschung sein.
  • AnythingBase ist fast immer ein Anti-Pattern. Werde ElectionServiceBase los. Wenn wir eine gemeinsame Schnittstelle brauchen, definieren Sie sie. Ziehen Sie es vor, allgemeines Verhalten in Hilfsmethoden zu stecken, anstatt sie zu erben, usw.
  • Führen Sie blockierende E/A in einem Thread-Pool aus, der für das Blockieren von E/A ausgelegt ist. Blockieren Sie nicht den globalen Fork-Join-Pool.
  • Reißen Sie die State-Machine-artige Logik heraus. Wenn Sie Führung angeboten bekommen, großartig, Sie sind der Anführer. Wenn Sie verlieren, dann halten Sie sich bereit. Wenn Sie von Führung zu Nichtführung übergehen, CRASH. Die Leiterverriegelung des Kurators versucht ständig, die Führung zu erlangen, falls der Leiter verschwindet. Es muss nicht regelmäßig "neu gestartet" werden.

Das fallende Scala-Skript veranschaulicht, wie prägnant unser Leader-Wahlmodul sein sollte:

https://gist.github.com/timcharper/22a1bca65e9a8268225dcfb97420cdf7

Hilfreichster Kommentar

Scalas eigene Empfehlung lautet, einen Threadpool mit fester Größe zum Blockieren von IO zu haben.

Alle 7 Kommentare

Ich stimme den meisten Ihrer Punkte zu. Einige Ergänzungen:

  • ElectionServiceBase : Die gemeinsame Schnittstelle ist bereits definiert: ElectionService .
  • Führen Sie blockierende E/A in einem Thread-Pool aus, der für das Blockieren ausgelegt ist. Dies ist ein größeres Thema für alle Orte, an denen wir IO betreiben. Schlagen Sie vor, für jeden Fall mehrere verschiedene Thread-Pools zu verwenden?

Scalas eigene Empfehlung lautet, einen Threadpool mit fester Größe zum Blockieren von IO zu haben.

Der Wahlcode verwendet eine andere Clientinstanz. Sollte es das gleiche wie der Speicher verwenden?

Ich möchte auch, dass stopLeadership und startLeadership sperrenfrei / nicht blockierend sind. Siehe meinen Kommentar in D379 .

@jeschkies warum hast du überhaupt stopLeadership ? Warum nicht einfach abstürzen?

@jeschkies sollte wahrscheinlich dieselbe Clientinstanz verwenden, aber ich bin mir nicht sicher, ob Curator hinter den Kulissen eine Aggregation des Zookeeper-Verbindungspools durchführt.

Bei genauerem Nachdenken sollten wir mehr recherchieren. Was passiert, wenn auf dem Speicher eine hohe Menge an Lese-/Schreibverkehr vorhanden ist und es zu einem Rückstand kommt? Könnten wir die Führung verlieren? Ich bin mir nicht sicher, was die Folgen sind.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen