Empfehlungen für C/C++ remote message queues
Arbeite ich an einem Projekt, das beinhaltet mehrere C++ - Programme, die jeder der Eingaben und die Ausgabe generieren. Die Daten (Tausende von bytes, wahrscheinlich JSON) im wesentlichen fließt (asynchron) in eine Richtung, und die Programme müssen sich auf verschiedenen Linux-Computer auf der ganzen LAN.
Da die Daten fließen nur in eine Richtung, ich glaube nicht, dass ich brauche ein Transaktions-Modell wie HTTP. Ich denke, eine message-queue-Modell (fire and forget) macht am meisten Sinn und vereinfachen sollte, die Logik der einzelnen Programme. Es ist wahrscheinlich ausreichend, um lediglich beachten, dass die Nachricht wurde Hinzugefügt, um die remote-Warteschlange erfolgreich.
Was ich Suche sind Empfehlungen für das implementieren dieser message-queue in C oder C++. Wie es scheint, POSIX und Boost message queues sind beschränkt auf einen einzelnen host, und RabbitMQ zu haben scheint schwach C/C++ - Unterstützung und MQ4CPP scheint unzureichend unterstützt für eine geschäftskritische Rolle. Bin ich falsch darüber? Was ist mit Boost ASIO oder ACE oder schreiben-socket-code selbst? Ich freue mich auf Ihre Vorschläge.
- ZeroMQ ist ziemlich nice.
- Super Antworten, jeder, aber ich mag die Einfachheit von ZeroMQ. Wenn @sixlettervariables es eine Antwort, die ich akzeptieren würde.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Bezug auf die einfache messaging-Unterstützung, ZeroMQ ist schwer zu schlagen. Es ist verfügbar in vielen Sprachen Bindungen und unterstützt alles, vom einfachen senden und empfangen von pub/sub, fanout, oder sogar eine messaging-pipeline. Der code ist auch leicht zu verdauen, und macht es Recht einfach zum wechseln zwischen mustern.
Blick auf Ihre Wetter-Update-Server-Beispiel (im 20 einige ungerade Sprachen) zeigt, wie einfach es sein kann, zu erstellen, zu veröffentlichen - /abonnieren-setups:
Ich habe es auf einigen gemischten C# und Python-Prozesse ohne viel Aufwand.
Persönlich, wenn ich die Frage verstehen, ich denke, Sie sollten verwenden Sie eine niedrigere Ebene TCP-Verbindung. Es hat all die garantierte Lieferung, die Sie möchten, und hat eine ziemlich gute Berkley Sockets API.
Ich habe festgestellt, dass, wenn Ihr bereit, um zu implementieren ein sehr einfaches Protokoll (zB. vier-byte-NBO Länge der Nachricht, n bytes Daten), können Sie sehr einfach, sehr individuell und sehr einfach. Wenn Sie mit dieser gehen, Sie auch (wie bereits erwähnt) bekommen große C-Unterstützung (was bedeutet, dass C++ - Unterstützung, obwohl die Dinge nicht in Klassen und Methoden). Die socket-code ist auch sehr einfach, und Sie haben asynchrones IO mit dem standard async-flags für die Linux/UNIX/POSIX-IO-Funktionen (ja, das ist einer der anderen Vorteile, wenn Sie wissen nichts über POSIX Programmierung, die Sie im Grunde wissen die socket-API).
Eine der besten Ressourcen für das lernen der socket-API sind:
man
,man
,man
,man
,man
,make
,man
, ...)Auch für die Bereitstellung von Daten-Netzwerk-verschickbar, wenn Ihre Daten in JSON, haben Sie keine sorgen. Da JSON nur ASCII-oder UTF-8), kann er versendet werden roh über das Netzwerk mit nur einer Länge header. Es sei denn, Ihr versucht zu senden, etwas kompliziert mit binären, dieser sollte perfekt sein (wenn Sie kompliziert ist Binär, entweder mit Blick auf die Serialisierung vorbereiten oder für eine Menge von
Segmentation Fault
).Auch, Sie wohl, wenn Sie den socket-Pfad verwenden möchten, TCP. Obwohl UDP wird Ihnen der ein-Weg-Aspekt, die Tatsache, dass es zuverlässig ist, Messen Sie Ihre selbstgebackenen Lösung gegen die top-of-the-line TCP-gegeben durch den Linux-kernel, TCP -, ist eine offensichtliche option.
RabbitMQ ist nur eine Umsetzung von AMQP. Sie möglicherweise wollen untersuchen, Apache Qpid oder andere Varianten, die möglicherweise mehr C/C++ - freundlich. Es ist ein libamqp für C obwohl ich keine Erfahrungen aus Erster hand mit. Ich weiß nicht genau, was Ihre Anforderungen sind aber AMQP, richtig implementiert, ist die industrielle Stärke und sollte Größenordnungen schneller und stabiler als alles, was Sie gehen, um zu bauen, von hand in kürzester Zeit.
Ich bin mit Boost-Serialisierung und-Buchse zu senden, die für eine ähnliche Anwendung. Sie finden ein Beispiel für die Serialisierung hier :
http://code.google.com/p/cloudobserver/wiki/TutoriaslBoostSerialization
Und auf dieser Seite:
http://www.boost.org/doc/libs/1_38_0/doc/html/boost_asio/examples.html
unter Serialisierung finden Sie Beispiele auf, wie man Server und clients. Stellen Sie einen server auf einem bestimmten port und generieren Sie mit mehreren clients auf mehreren Computern, die miteinander kommunizieren können mit diesem port.
Den Nachteil mit boost-Serialisierung ist, dass es einen großen overhead, wenn Sie eine einfache Datenstruktur serialisiert werden soll aber es macht es einfach.
Eine weitere Empfehlung ist die verteilten framework OpenCL. Das Dokument Die OpenCL C++ - Wrapper für die API bietet weitere Informationen über die Bibliothek. Insbesondere die API-Funktion
cl::CommandQueue
könnte von Interesse sein für die Erstellung von Warteschlangen auf Geräte innerhalb eines Netzwerk-setup.Anderen messaging-Lösung ist ICE (http://www.zeroc.com/). Es ist multi-Plattform, multi-Sprache. Es verwendet eine RPC-Ansatz.