MassTransit- und Event-versus-Command-Publishing

8

Ich bin neu bei MassTransit und vermisse etwas in meinem Verständnis.

Nehmen wir an, ich habe eine Serverfarm, in der alle Knoten den gleichen Job ausführen können. Das Anwendungsframework ist CQRS-Stil. Das bedeutet, ich habe zwei grundlegende Arten von Nachrichten zu veröffentlichen:

  • Kommandos: müssen von genau einem der Server behandelt werden, jeder von ihnen (der erste mit Job-Slot frei)
  • Ereignisse: müssen von allen Servern gehandhabt werden

Ich habe einen extrem einfachen MassTransit-Prototyp gebaut (eine Konsolenanwendung, die alle x Sekunden Hallo sendet).

In der API kann ich sehen, dass es eine "publish" -Methode gibt. Wie kann ich angeben, um welche Art von Nachricht es sich handelt (eins gegen alle Server)?

Wenn ich die "Handler" -Konfiguration anschaue, kann ich die Warteschlange uri angeben. Wenn ich dieselbe Warteschlange für alle Hosts anmelde, erhalten alle Hosts die Nachricht, aber ich kann die Ausführung nicht auf nur einen Server beschränken.

Wenn ich von einer dedizierten Warteschlange des Hosts höre, wird nur ein Server mit den Nachrichten umgehen, aber ich weiß nicht, wie ich die andere Art von Nachricht senden soll.

Bitte helfen Sie mir zu verstehen, was ich vermisse.

PS: Wenn es mich interessiert, ist mein Messaging-System rabbitmq.

Um zu testen, habe ich eine gemeinsame Klassenbibliothek mit diesen Klassen erstellt:

%Vor%

Ich habe auch 3 Konsolenanwendungen, die nur die ActualMain-Methode ausführen:

%Vor%     
Steve B 27.07.2012, 15:23
quelle

1 Antwort

9

Was Sie wollen, ist bekannt als konkurrierende Verbraucher (suchen Sie nach SO, dass Sie weitere Informationen finden werden) Die Verwendung von RabbitMQ macht das Leben einfach. Sie müssen nur den Namen der Warteschlange für jeden Benutzer angeben, den Sie starten. Die Nachricht wird nur von einem der Benutzer verarbeitet. Anstatt jedes Mal eine eindeutige Warteschlange zu erstellen, während Sie das tun.

%Vor%

AFAIK, Sie müssen einen separaten Prozess für Befehlshandler im Gegensatz zu Event-Handlern haben. Alle Befehlshandler werden empfangen. Aus derselben Warteschlange empfangen alle Ereignishandler ihre eigene eindeutige Warteschlange.

Das andere Teil des Puzzles ist, wie Sie Nachrichten in den Bus bekommen. Sie können die Veröffentlichung weiterhin für Befehle verwenden, aber wenn Sie die Benutzer falsch konfiguriert haben, können Sie mehrere Ausführungen ausführen, da die Nachricht an alle Benutzer gesendet wird. Wenn Sie sicherstellen möchten, dass die Nachricht in einer einzelnen Warteschlange endet, können Sie Senden statt Veröffentlichen verwenden.

%Vor%     
Adam Mills 10.08.2012, 12:01
quelle

Tags und Links