Was sind die Lösungen für das Problem der verteilten Warteschlange?

23

Ich versuche, mehr über die verschiedenen Möglichkeiten zu erfahren, mit denen das Problem einer verteilten Warteschlange gelöst werden kann. Ich würde gerne wissen, welche Produkte, Dienstleistungen, Implementierungen und Forschungsarbeiten es bereits gibt.

Eine Implementierung wird mit vielen Herausforderungen konfrontiert sein und Kompromisse eingehen müssen:

  • Hat es starke oder lose Bestellung?
  • Hat es idempotent gestellt?
  • Können wir mehr Warteschlangen haben als auf eine einzelne Maschine passen?
  • Können wir mehr Daten in einer Warteschlange haben, als auf eine einzelne Maschine passen können?
  • Wie viele Computer können abstürzen, bevor Daten verloren gehen?
  • Kann es Net-Splits tolerieren?
  • Kann es automatisch Daten abgleichen, wenn ein Net-Split behoben ist?
  • Kann es die Lieferung garantieren, wenn Kunden abstürzen können?
  • Kann es garantieren, dass dieselbe Nachricht nicht mehr als einmal zugestellt wird?
  • Kann ein Knoten an einem bestimmten Punkt abstürzen, wieder auftauchen und keinen Müll senden?
  • Können Sie Knoten zu einem laufenden Cluster ohne Ausfallzeit hinzufügen oder Knoten daraus entfernen?
  • Können Sie Knoten in einem laufenden Cluster ohne Ausfallzeit aktualisieren?
  • Läuft es problemlos auf heterogenen Servern?
  • Können Sie Warteschlangen an eine Gruppe von Servern binden? (Beispiel: "Diese Warteschlangen sind nur im europäischen Rechenzentrum zulässig.")
  • Kann es sicherstellen, dass Datenreplikate in mindestens zwei Rechenzentren abgelegt werden, sofern diese verfügbar sind?

Ich habe keine Illusion, dass eine Implementierung all das mit „Ja“ beantworten kann. Ich bin nur daran interessiert, etwas über die verschiedenen Implementierungen zu erfahren. Wie sie funktionieren, welche Kompromisse sie eingegangen sind und warum sie sich vielleicht für ihre speziellen Kompromisse entschieden haben.

Auch wenn es irgendwelche Herausforderungen gibt, die ich in der obigen Liste verpasst habe.

Chris Vest
quelle

Antworten:

13

Das Schreiben eines einfachen Warteschlangensystems ist recht einfach, aber wie Sie oben bei allen Herausforderungen bemerkt haben, ist es eine andere Sache, es richtig zu machen. Ich habe einheimische Systeme verwendet, für die ich den Quellcode geschrieben habe, Systeme von Drittanbietern und verschiedene JMS-Anbieter. JMS (Java Messaging Service) ist mit Abstand die umfassendste Lösung, die mir bisher begegnet ist. Vieles von dem, was Sie verlangen, ist in JMS verfügbar. Mein Lieblings-JMS-Anbieter ist ActiveMQ. Kostenlos, performant, einfach zu installieren und vor allem einfach mit Spring in meine App einzubinden. JMS-Anbieter stellen nicht alles zur Verfügung, wonach Sie gefragt haben. Sie stellen jedoch eine Reihe von Tools bereit, mit denen Sie viele Ihrer Fragen beantworten können, falls Ihre Anwendung diese benötigt. Ich habe nicht festgestellt, dass viele Anwendungen alles benötigen, was Sie aufgelistet haben. Die Reihenfolge ist möglicherweise nicht wichtig (am besten, wenn nicht).

http://activemq.apache.org/what-open-source-integration-solution-works-best-with-activemq-.html

Hat es starke oder Bestellungen zu verlieren? Ja. Es hat beides je nach Ihren Programmbedürfnissen. Hier sind die Details: http://activemq.apache.org/total-ordering.html .

Hat es idempotent gestellt? Nein, aber es ist trivial, dies in Ihrer Anwendungsebene zu implementieren, falls Sie dies benötigen.

Können wir mehr Warteschlangen haben als auf eine einzelne Maschine passen? Ja. Sie können Cluster-Server haben, und wenn Sie mehrere Computer mit unterschiedlichen Warteschlangen einrichten möchten, können Sie diese auch von beiden ziehen.

Können wir mehr Daten in einer Warteschlange haben als auf eine einzelne Maschine passen? Ja, die meisten JMS-Anbieter müssen eine Art DB / persistenten Speicher verwenden, um sicherzustellen, dass Nachrichten nicht gelöscht werden oder verloren gehen, wenn der JMS-Anbieter ausfällt.

Wie viele Computer können abstürzen, bevor Daten verloren gehen? Dies ist etwas schwieriger zu beantworten, da es zeitabhängig ist. Sie können jedoch einen JMS-Anbieter zum Absturz bringen, und sofern der Datenträger nicht beschädigt ist, wird er wieder an der Stelle gestartet, an der er das letzte Commit erhalten hat. Dies bedeutet, dass Nachrichten zweimal zugestellt werden können, aber wenn Sie Ihre App dafür codieren, ist dies kein Problem. Solange Sie mindestens einen von jedem Typ haben (Produzenten, Konsumenten oder JMS-Server), wird dieser abgeschlossen. Sie können auch Load / Balance / Failover für Redundanz einrichten, falls eine Festplatte ausfällt.

Kann es Net-Splits tollerieren? Ich glaube, ich verstehe, was Sie unter "Netzsplit" verstehen, bin mir aber nicht ganz sicher. Ich vermute, Sie meinen, wenn die JMS-Server geclustert sind und die Verbindung zu einem der Server unterbrochen wird, springt der Server zu einem anderen Server und nimmt dort auf, wo er aufgehört hat. Ja, aber auch diese Situationen können zu doppelten Nachrichten führen, je nachdem, zu welchem ​​Zeitpunkt der Client die Verbindung verloren hat.

Kann es automatisch Daten abgleichen, wenn ein Net-Split behoben ist? Wenn Sie Transaktionssitzungen verwenden, werden nur Nachrichten, für die ein Commit aufgerufen wurde, an vorhandene Clients weitergeleitet, die aktiv sind.

Kann es die Lieferung garantieren, wenn Kunden abstürzen können? Ja, dies ist eines der Hauptziele von JMS. Garantierte Zustellung bedeutet, dass eine Nachricht, die sich in einer Warteschlange befindet, garantiert von einem Kunden bearbeitet wird.

Kann es garantieren, dass dieselbe Nachricht nicht mehr als einmal zugestellt wird? Ja, wenn die getätigten Sitzungen verwendet werden. Dies bedeutet, dass ein Client die Nachricht akzeptiert und Commit / Rollback aufgerufen hat. Sobald das Commit aufgerufen wurde, wird die Nachricht nicht mehr weitergeleitet.

Kann ein Knoten an einem bestimmten Punkt abstürzen, wieder auftauchen und keinen Müll verschicken? In dem Fall, in dem Sie dauerhafte gruppierte Warteschlangen haben. Ja, es wird kein "Junk" ausgegeben, wenn der andere Knoten im Cluster die Nachricht übermittelt hat. Es kann immer noch alles zurückliefern, was nicht bestätigt wurde.

Können Sie Knoten zu einem laufenden Cluster ohne Ausfallzeit hinzufügen oder Knoten daraus entfernen? Ja.

Können Sie Knoten in einem laufenden Cluster ohne Ausfallzeit aktualisieren? Für mich ist es etwas schwieriger zu beantworten, aber ich glaube, dass Sie dies tun können.

Läuft es problemlos auf heterogenen Servern? Was bedeutet das genau? Ich habe festgestellt, dass die meisten JMS-Anbieter sehr einfach in Umgebungen mit unterschiedlicher Hardware, Betriebssystem usw. ausgeführt werden können. Wenn Sie jedoch Leistung meinen, ist das eine ganz andere Sache. Jedes verteilte Verarbeitungssystem kann durch einen langsamen Knoten beeinträchtigt werden. Ich hatte 2 8 Core Intel Server, auf denen die Warteschlange und die Konsumenten liefen. Das sind 16 Kerne zusammen, und ich habe nur mit diesen beiden Boxen eine bessere Leistung erzielt, als wenn ich eine Single-Core-Maschine als Consumer hinzugefügt hätte. Diese Single-Core-Maschine war so viel langsamer, dass sie das gesamte Netz um den Faktor 2 verlangsamte. Dies hatte an sich nichts mit JMS zu tun.

Können Sie Warteschlangen an eine Gruppe von Servern binden? Kurze Antwort ja. Ich kann mir eine Möglichkeit vorstellen, wie Sie einen Cluster ausführen können, der nur im europäischen Rechenzentrum vorhanden ist, und die Warteschlange dort konfigurieren können. Richten Sie dann in Ihrer Frühjahrskonfiguration Ihre Konsumenten so ein, dass diese Warteschlange sowie andere Warteschlangen in anderen Clustern belegt werden. Vielleicht möchten Sie die Dokumente konsultieren:

http://activemq.apache.org/clustering.html

Kann es sicherstellen, dass Datenreplikate in mindestens zwei Rechenzentren abgelegt werden, sofern diese verfügbar sind? Ich glaube es wieder, aber es ist am besten, die Clustering-Dokumente zu konsultieren.

Auch hier bietet JMS zahlreiche Optionen, die Sie nach Bedarf anpassen können. Die Verwendung von durchgeführten Sitzungen und dauerhaften Warteschlangen ist mit Performancekosten verbunden. Ich habe gesehen, wie das Einschalten aller Schnickschnack die Leistung um das Zehnfache beeinflusst hat. Wenn ich JBossMQ verwendete, wenn wir einige dieser Funktionen ausschalteten, konnten wir ungefähr 10.000 Nachrichten / s erhalten, aber wenn wir sie einschalteten, wurden wir auf 1000 Nachrichten / s reduziert. Großer Tropfen.

Chubbsondubs
quelle
Vielen Dank, dass Sie sich die Zeit für diese Antwort genommen haben. Ein Net-Split liegt vor, wenn einige Knoten in einem Cluster nicht mehr mit dem Rest kommunizieren können. Mit heterogenen Servern meine ich meistens unterschiedliche Mengen an RAM - einige verteilte Systeme bevorzugen es, wenn Server gleich aussehen.
Chris Vest
Dann sicher ja auf Netsplits. Wenn ein Verbraucher ausfällt oder nicht kommunizieren kann, versucht er weiterhin, eine Verbindung herzustellen. Aufträge, die an ihn vergeben wurden und keine Zusage erhalten haben, werden später an andere Verbraucher weitergeleitet. Wenn ein JMS-Anbieter ausfällt und Sie andere Mitglieder des Clusters haben, können Nachrichten im gesamten Cluster dupliziert werden, um zu verhindern, dass Nachrichten verloren gehen.
Chubbsondubs
Es gibt keine Anforderungen daran, dass Maschinen identisch sind, egal ob RAM, Hardware oder Betriebssystem. Sie können bei Bedarf eine gemischte Tüte von Maschinen betreiben. Das einzige Problem ist das, das ich festgestellt habe. Es hängt von der Leistung der Maschinen ab, die nicht gleich sind. Die Nachrichten werden mit unterschiedlichen Raten verarbeitet, was zu einem niedrigeren Durchsatz führen kann. Das JMS-Modell mildert dies jedoch etwas dadurch ab, dass es ein Pull-Modell anstelle eines Push-Modells ist. Push-Modelle reagieren viel empfindlicher auf diese Art von Problemen.
Chubbsondubs