Warum AMQP / ZeroMQ / RabbitMQ verwenden?

73

im Gegensatz zum Schreiben einer eigenen Bibliothek.

Wir arbeiten hier an einem Projekt, das ein sich selbst teilender Serverpool sein wird. Wenn ein Abschnitt zu schwer wird, würde der Manager ihn teilen und als separaten Prozess auf einen anderen Computer stellen. Außerdem werden alle betroffenen Clients, die davon betroffen sind, darauf hingewiesen, eine Verbindung zum neuen Server herzustellen.

Ich bin neugierig auf die Verwendung von ZeroMQ für die Kommunikation zwischen Servern und Prozessen. Mein Partner würde es vorziehen, seine eigenen zu rollen. Ich freue mich auf die Community, um diese Frage zu beantworten.

Ich bin selbst ein ziemlich unerfahrener Programmierer und habe gerade etwas über Messaging-Warteschlangen gelernt. Während ich gegoogelt und gelesen habe, scheint es, dass jeder Messaging-Warteschlangen für alle möglichen Dinge verwendet, aber warum? Was macht sie besser als das Schreiben einer eigenen Bibliothek? Warum sind sie so häufig und warum gibt es so viele?

Böser Spork
quelle
4
Der Grund, warum Sie keine eigene Bibliothek schreiben sollten, ist, dass Sie nach Ihren eigenen Worten "ein ziemlich unerfahrener Programmierer" sind. Warum sollten Sie eine MQ-Bibliothek verwenden, die von einem unerfahrenen Programmierer geschrieben wurde?
Jeff

Antworten:

77

Was macht sie besser als das Schreiben einer eigenen Bibliothek?

Bei der Einführung der ersten Version Ihrer App wahrscheinlich nichts: Ihre Anforderungen sind genau definiert und Sie entwickeln ein Messaging-System, das Ihren Anforderungen entspricht: kleine Funktionsliste, kleiner Quellcode usw.

Diese Tools sind nach der ersten Version sehr nützlich , wenn Sie Ihre Anwendung tatsächlich erweitern und weitere Funktionen hinzufügen müssen. Lassen Sie mich einige Anwendungsfälle nennen:

  • Ihre App muss mit einem Big-Endian-Computer (sparc / powerpc) von einem kleinen Endian-Computer (x86, Intel / AMD) aus kommunizieren. Ihr Messaging-System hatte eine Endian-Bestellannahme: Gehen Sie und beheben Sie es
  • Sie haben Ihre App so konzipiert, dass sie kein binäres Protokoll- / Messagingsystem ist. Jetzt ist sie sehr langsam, da Sie die meiste Zeit damit verbringen, sie zu analysieren (die Anzahl der Nachrichten hat zugenommen und das Parsen wurde zu einem Engpass): Passen Sie sie an, damit sie binäre / transportieren kann. feste Kodierung
  • Am Anfang hatten Sie 3 Maschinen in einem LAN, keine merklichen Verzögerungen, alles kommt zu jeder Maschine. Ihr Client / Boss / Pointy-Haired-Devil-Boss wird angezeigt und teilt Ihnen mit, dass Sie die App in einem WAN installieren werden, das Sie nicht verwalten. Anschließend treten Verbindungsfehler, schlechte Latenz usw. auf. Sie müssen die Nachricht speichern und das Senden wiederholen sie später: gehe zurück zum Code und stecke dieses Zeug ein (und genieße)

  • Gesendete Nachrichten müssen Antworten haben, aber nicht alle: Sie senden einige Parameter ein und erwarten als Ergebnis eine Tabelle, anstatt nur zu senden und zu bestätigen. Gehen Sie zurück zum Code und schließen Sie dieses Zeug an (und genießen Sie es.)

  • Einige Nachrichten sind kritisch und dort erfordert der Empfang / das Senden eine ordnungsgemäße Sicherung / Persistenz /. Warum fragst du ? Prüfungszwecke

Und viele andere Anwendungsfälle, die ich vergessen habe ...

Sie können es selbst implementieren, verbringen aber nicht viel Zeit damit: Sie werden es wahrscheinlich sowieso später ersetzen.

ppi
quelle
ahh, vielen dank Dies gibt mir sicherlich einige Denkanstöße.
Evil Spork
Laut dem offiziellen Zeromq-Leitfaden bietet Zeromq keine Persistenz. Die Anleitung zeigt Ihnen, wie das geht, aber ich hätte lieber etwas, das in das Framework eingebettet ist, ohne schlecht getesteten Tutorial-Code zu verwenden!
Robin Green
3
Nicht einverstanden mit "Wenn Sie die erste Version Ihrer App einführen, wahrscheinlich nichts". Zum Schluss sagen Sie, dass die erste Version ohnehin mit einer Bibliothek neu geschrieben wird. Sie können auch mit etwas beginnen, das Sie nicht wegwerfen. Ansonsten stimme ich zu.
OO
@OO In den meisten Fällen sind die anfänglich benötigten Funktionen klein und Sie können den Import von Inhalten von Drittanbietern nicht immer einfach rechtfertigen: Genehmigungen, Sicherheitsüberprüfungen des Codes usw. erfordern, je nachdem, für wen Sie arbeiten, viel mehr Zeit als Entwicklungszeit. Daher fangen Sie klein an, machen es selbst mit den Tools, die sich bereits in der Firma befinden, und wenn Ihr Code in einem Produkt verwendet wird, das häufig verwendet wird, wird die Verwendung von Inhalten von Drittanbietern einfacher. Ihr Kilometerstand kann variieren, aber normalerweise möchten Unternehmen keine Unmengen von Materialien / Frameworks / Bibliotheken von Drittanbietern verwenden.
ppi
40

Das ist sehr ähnlich wie zu fragen: Warum eine Datenbank verwenden, wenn Sie Ihre eigene schreiben können?

Die Antwort lautet: Die Verwendung eines Tools, das es schon seit einiger Zeit gibt und das in vielen verschiedenen Anwendungsfällen gut verstanden wird, zahlt sich im Laufe der Zeit und mit der Entwicklung Ihrer Anforderungen immer mehr aus. Dies gilt insbesondere dann, wenn mehr als ein Entwickler an einem Projekt beteiligt ist. Möchten Sie Support-Mitarbeiter für ein Warteschlangensystem werden, wenn Sie zu einem neuen Projekt wechseln? Die Verwendung eines Werkzeugs verhindert dies. Es wird zum Problem eines anderen.

Ein typisches Beispiel: Ausdauer. Das Schreiben eines Tools zum Speichern einer Nachricht auf der Festplatte ist einfach. Es ist schwierig, einen Persistor zu schreiben , der in vielen verschiedenen Anwendungsfällen gut und stabil skaliert und funktioniert, überschaubar und billig zu unterstützen ist. Wenn Sie jemanden sehen möchten, der sich darüber beschwert, wie schwer es ist, schauen Sie sich das an: http://www.lshift.net/blog/2009/12/07/rabbitmq-at-the-skills-matter-functional-programming-exchange

Wie auch immer, ich hoffe das hilft. Schreiben Sie auf jeden Fall Ihr eigenes Werkzeug. Viele, viele Leute haben es getan. Was auch immer Ihr Problem löst, ist gut.

alexis
quelle
1
Oder ein Compiler. Warum sollte man sich die Mühe machen, eine kompilierte Sprache zu verwenden, wenn man immer reine, unverfälschte Assemblersprache schreiben kann? :-)
Jeff
18

Ich denke darüber nach, ZeroMQ selbst zu verwenden - daher bin ich auf diese Frage gestoßen.

Nehmen wir für den Moment an, dass Sie ein Nachrichtenwarteschlangensystem implementieren können, das alle Ihre Anforderungen erfüllt. Warum sollten Sie ZeroMQ (oder eine andere Bibliothek von Drittanbietern) anstelle des Roll-Your-Own-Ansatzes verwenden? Einfach - Kosten.

Nehmen wir für einen Moment an, dass ZeroMQ bereits alle Ihre Anforderungen erfüllt. Alles, was Sie tun müssen, ist, es in Ihren Build zu integrieren, ein Dokument zu lesen und es dann zu verwenden. Das muss viel weniger Aufwand sein, als das eigene zu rollen. Außerdem wurde die Wartungslast auf ein anderes Unternehmen verlagert. Da ZeroMQ kostenlos ist, haben Sie Ihr Entwicklungsteam soeben um das ZeroMQ-Team erweitert.

Wenn Sie ein Softwareentwicklungsunternehmen betreiben würden, würden Sie meiner Meinung nach die Kosten / das Risiko der Verwendung von Bibliotheken von Drittanbietern gegen das Rolling Ihrer eigenen Bibliotheken abwägen. In diesem Fall würde die Verwendung von ZeroMQ zweifellos gewinnen.

Vielleicht leiden Sie (oder besser gesagt Ihr Partner), wie so viele Entwickler, unter dem "Not Invented Here" -Syndrom? Wenn ja, passen Sie Ihre Einstellung an und überdenken Sie die Verwendung von ZeroMQ. Persönlich bevorzuge ich die Vorteile der Einstellung „Stolz anderswo gefunden“. Ich hoffe, ich kann stolz darauf sein, ZeroMQ zu finden ... die Zeit wird es zeigen.

BEARBEITEN: Ich bin auf dieses Video von den ZeroMQ-Entwicklern gestoßen, das darüber spricht, warum Sie ZeroMQ verwenden sollten.

Daniel Paull
quelle
Ich stimme Ihnen bis zu einem gewissen Punkt zu. Ich habe in den letzten Monaten mit ein paar Programmen in C ++ gearbeitet, seit diese Frage gestellt wurde. Und ich bin in die Hölle geraten, das sind Bibliotheken von Drittanbietern. Einige sind relativ schmerzlos .. aber viele von ihnen fügen mehr Ärger hinzu, als sie wert sind .. nur versuchen, sie zu installieren. Ich bin mir immer noch nicht sicher, warum irgendjemand Anforderungen an zeroMQ haben würde. Eines der ersten Dinge, die ich schreiben lernte, war, wie man eine Nachricht von einem Programm über TCP und Sockets für ein sehr einfaches Chat-Programm an ein anderes sendet. Es war relativ einfach ..
Evil Spork
1
Stimmen Sie voll und ganz zu, dass viele (vielleicht die meisten?) Bibliotheken von Drittanbietern mehr Probleme bereiten, als sie wert sind. Ich glaube, ich habe im Laufe der Jahre einige echte Juwelen gefunden, mit denen ich gerne arbeite. Ich habe gerade ZeroMQ kompiliert und ihre Tests ausgeführt. Es sieht ziemlich gut aus. Es hat noch keinen "Edelstein" -Status, aber wir werden sehen ...
Daniel Paull
1
Nur um nachzufolgen - ich habe festgestellt, dass ZeroMQ ziemlich gut ist. Es ist sicherlich sehr leicht und schnell. Ich mag die Art und Weise nicht, wie ihr Socket Thread-Affinität hat, da ich zwei Threads verwenden möchte, um auf den Socket zuzugreifen - einen zum Lesen von Nachrichten und einen zum Schreiben von Nachrichten. Es wird davon ausgegangen, dass die "ZeroMQ" -Methode darin besteht, in Bearbeitung befindliche Nachrichtenwarteschlangen zu verwenden, um Nachrichten zwischen Threads zu sammeln ... weitere Überlegungen sind erforderlich.
Daniel Paull
Interessant, bitte teilen Sie mehr mit mehr Erfahrung!
Evil Spork
1
Ich habe gestern eine alternative Messaging-Implementierung für meine App geschrieben, die auf Boost.Asio basiert ( boost.org/doc/libs/1_37_0/doc/html/boost_asio.html ). Das passt viel besser zu meinen Bedürfnissen. Ich habe die Leistung noch nicht gemessen, aber ich gehe davon aus, dass sie recht gut sein wird. Ich denke, es ist genauso einfach, ZeroMQ zu verwenden, wenn Sie nicht alle Früchte benötigen (wie das Pubish / Subscribe-Muster), aber eine weitaus bessere Dokumentation haben.
Daniel Paull
6

Was macht sie besser als das Schreiben einer eigenen Bibliothek?

Nachrichtenwarteschlangensysteme sind Transaktionssysteme, die konzeptionell einfach als Client zu verwenden sind, aber als Implementierer schwer zu finden sind, insbesondere unter Berücksichtigung dauerhafter Warteschlangen. Sie könnten denken, Sie könnten mit dem Schreiben einer schnellen Messaging-Bibliothek davonkommen, aber ohne Transaktionen und Persistenz hätten Sie nicht die vollen Vorteile eines Messaging-Systems.

Persistenz bedeutet in diesem Zusammenhang, dass die Messaging-Middleware nicht behandelte Nachrichten im permanenten Speicher (auf der Festplatte) aufbewahrt, falls der Server ausfällt. Nach einem Neustart können die Nachrichten verarbeitet werden und es ist keine erneute Übertragung erforderlich (der Absender weiß nicht einmal, dass ein Problem aufgetreten ist). Transaktion bedeutet, dass Sie Nachrichten aus verschiedenen Warteschlangen lesen und Nachrichten auf transaktionale Weise in verschiedene Warteschlangen schreiben können. Dies bedeutet, dass entweder alle Lese- und Schreibvorgänge erfolgreich sind oder (wenn einer oder mehrere fehlschlagen) keine erfolgreich sind. Dies unterscheidet sich nicht wesentlich von der Transaktionsfähigkeit, die durch die Schnittstelle mit Datenbanken bekannt ist, und hat dieselben Vorteile (es vereinfacht die Fehlerbehandlung; ohne Transaktionen müssten Sie sicherstellen, dass jedes einzelne Lesen / Schreiben erfolgreich ist, und wenn eines oder mehrere fehlschlagen, haben Sie dies getan die erfolgreichen Änderungen rückgängig zu machen).

pmf
quelle
1
Ich habe eine kurze Zeit darüber nachgedacht. Was genau meinen Sie mit Transaktionen und Persistenz? Ich verstehe die Worte, aber nicht den Kontext hier. Einfach gesagt, es klingelt vor Modewörtern.
Evil Spork
2
Ich würde diese Schlagworte nicht nennen; Persistenz und Transaktionen sind unter diesen Namen seit mehreren Jahrzehnten bekannt. Ich habe meine Antwort bearbeitet, um diese Punkte im Zusammenhang mit Nachrichten zu erläutern.
PMF
Interessant, aber was macht es so schwer, diese richtig zu machen? Aus meiner Sicht scheinen Sie, wenn ich einen Server und einen Client schreibe, die Nachricht zu senden, sicherzustellen, dass die Nachricht vollständig empfangen wird, und ein Duplikat der Nachricht auf der Festplatte zu speichern. Das ist das Ende davon. Warum gibt es so viele Versionen eines so simplen Systems? Ich meine, viele von ihnen sind in Bezug auf den Code ziemlich klein. Wenn Sie erst einmal verstanden haben, wie sie funktionieren, scheint die Implementierung nicht so viel zu erfordern. Es kommt also darauf zurück, warum eine vorab geschriebene Messaging-Warteschlange verwendet wird.
Evil Spork
Transaktionen sind sehr einfach zu implementieren, wenn Sie sich nicht um Latenz und / oder Korrektheit kümmern. Hier finden Sie eine Übersicht über einige typische Implementierungsprobleme: jroller.com/pyrasun/category/XA
ddimitrov
Wenn ich den offiziellen Zeromq-Leitfaden richtig verstanden habe, ist er nicht dauerhaft. Sie müssen darauf Ausdauer aufbauen.
Robin Green
4

Lesen Sie vor dem Schreiben Ihrer eigenen Bibliothek den 0MQ-Leitfaden hier: http://zguide.zeromq.org/page:all

Es besteht die Möglichkeit, dass Sie sich entweder für die Installation von RabbitMQ entscheiden oder Ihre Bibliothek auf ZeroMQ aufbauen, da alle harten Teile bereits erledigt sind.

Michael Dillon
quelle
2
Sie haben einige "harte Teile" in Tutorial-Manier in der Anleitung gemacht (z. B. Ausdauer). Ich würde lieber eine kampferprobte Implementierung verwenden als einen schlecht getesteten Tutorial-Code.
Robin Green
1
Wenn Sie eine kampferprobte Implementierung wünschen, würden Sie AMQP anstelle von ZMQ wählen und so etwas wie RabbitMQ
Michael Dillon
2

Wenn Sie etwas Zeit haben, probieren Sie es aus und rollen Sie Ihre eigene Implementierung aus! Die Erkenntnisse dieser Übung werden Sie von der Weisheit überzeugen, eine bereits getestete Bibliothek zu verwenden.

Bubblecyber
quelle