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.