2009-03-11 1 views
3

Ich entwickle eine Anwendung, in der verteilte Komponenten über ein Netzwerk in einer asynchronen, Pub/Sub Art miteinander kommunizieren.Was ist der beste Weg für verteilte Prozesse, asynchron zu kommunizieren?

Dafür mag ich die Idee, XML über Sockets zu senden - es ist asynchron, ich brauche keinen Server irgendeiner Art, und es kann lokal oder über ein Netzwerk arbeiten. Ich würde meinen eigenen Pub/Sub-Mechanismus rollen müssen, der wahrscheinlich nicht zu beschwerlich sein wird - ich könnte die IP-Adresse als ID des Abonnenten verwenden. Die Implementierungssprache ist C++. Ich habe diese Methode zuvor mit guten Ergebnissen verwendet. Aber ich frage mich, ob es einen besseren Weg gibt? Jeder Rat willkommen.

Edit: Ich habe noch keine Entscheidung gemacht, aber ich bin in cparcode Kommentar auf protobuf interessiert.

„Ich habe nie verstanden, die Popularität von XML für Netzwerk Comms mit irgendeiner Weise stelle ich fest, dass die Protokoll ist nur ein Teil Ihres Problems, aber zu diesem Thema gibt es Googles Protobuf auch: http://code.google.com/p/protobuf/ - caparcode (Mar 11 at 1:01)

+0

Ummm ... Buchsen nativ asynch? vielleicht in einem Paralleluniversum? – dkretz

+0

alle modernen Socket-Bibliotheken haben asynch APIs – Javier

+0

Dinge zu beachten: XML-Parsing-Leistung, dauerhafte Socket-Speicher-Overhead, usw. Aber wie andere gesagt haben, wenn Sie es in der Vergangenheit getan haben, dann können Sie es erneut tun. Es wäre schön, Ihre anderen Anforderungen zu beschreiben: Wie viele Maschinen im Netzwerk? Gibt es Perf-Anforderungen? – slacy

Antwort

3

Anstatt XML zu verwenden, könnte es am besten sein, ein vorhandenes Message Passing Framework zu verwenden. Werfen Sie einen Blick auf libt2n oder d-bus

Aber Sie haben Ihre eigene Socket-Implementierung in der Vergangenheit mit guten Ergebnissen verwendet, sehe ich keinen Grund, warum Sie ändern sollten. Wenn es nicht kaputt ist, repariere es nicht :)

+0

Ich habe nie die Popularität von XML für Netzwerk-Kommunikation verstanden. Irgendwie merke ich, dass das Protokoll nur ein Teil Ihres Problems ist, aber zu diesem Thema gibt es auch Google's Protobuf: http://code.google.com/p/protobuf/ –

+0

+1 auf Protobuf. viel kompakter als jedes textbasierte Format, und eine einfach zu bedienende API für C++, Java und Python sorgt für Interoperabilität. – Javier

+0

Dbus ist gut, wenn die Aufgaben immer auf der gleichen Maschine sind. Ich glaube, dass man es mit etwas Arbeit über IP zu anderen Maschinen bringen kann, aber es ist nicht wirklich für diesen Anwendungsfall gedacht. –

0

Besonders wenn du es vorher getan hast, und es immer noch deine Bedürfnisse erfüllt, bleib dabei.

+0

aber jetzt, da er weiß, wie es geht, denkt er darüber nach, es zu verbessern. – Javier

1

Anstatt nur gerade Buchsen, könnten Sie consider a solution like AMQP.

Wenn Sie über Socket-Verbindungen für eine Pub/Sub-Schnittstelle sprechen, bedeutet das normalerweise eine Punkt-zu-Punkt-Kommunikation, die nicht immer eine skalierbare Lösung ist. AMQP adressiert diese Art von Pub/Sub-Problem. Es ist kostenlos, es ist Open-Source und es funktioniert.

Vorausgesetzt, dass sie das Pub/Sub-Problem bereits gelöst haben, möchten Sie möglicherweise ihre Arbeit nutzen, anstatt es selbst zu tun.

Ich empfehle OpenAMQ.

aber sagen, dass es hängt wirklich davon ab, welche Art von Umgebung, die Sie gerade arbeiten. AMQP erfordert einen AMQP-Broker (eine Anwendung für Nachrichten-Routing) im System läuft irgendwo zu sein.

0

Wie wäre es mit dem Einbetten eines Webservers in Ihre App? EasyHTTPD ist Open Source, C++, und ziemlich einfach zu bedienen. Der asynchrone Teil ist einfach genug. Sie spinnen entweder einen neuen Thread auf dem Sender oder dem Empfänger.

0

Wenn Sie nach XML suchen und plattformübergreifend booten, können Sie einen XML-RPC-Mechanismus wie SOAP in Erwägung ziehen (Ich habe gSoap für die Kommunikation zwischen einem C-Server unter Linux mit einem C++ - Client auf win32 verwendet. und es hat gut funktioniert, sobald Sie alles herausfinden).

1

Werfen Sie einen Blick auf ActiveMQ. Es ist ein JMS Provider und hat auch Bindungen in vielen anderen Sprachen, arbeitet auf mehreren Transporten und hat eine Auswahl von Protokollen, die es für seine Nachrichten verwendet.

0

Wenn Sie keine starke Neigung zu XML haben und etwas Einfaches und Effizienteres wollen, dann sollten Sie sich die Bibliothek YAMI ansehen. Es ist ziemlich einfach zu verwenden und der angegebene Link enthält genug Dokumentation, Begründung und Beispiele, um loszulegen.

1

RabbitMQ ist auch ein AMQP-Broker, der auch andere Protokolle wie XMPP, HTTP, STOMP, SMTP mit Adaptern unterstützt.

Verwandte Themen