2017-01-15 5 views
1

Ich versuche, ein RabbitMQ-Messaging-System horizontal zu skalieren. Das aktuelle System ist sehr einfach - der Hersteller sendet eine Nachricht an einen Fanout-Austausch und die Nachricht wird von mehreren Verbrauchern verarbeitet - klassisches Fanout-Routing.RabbitMQ Work-Queue für FanOut Messaging

Ich habe mehrere Verbraucher von verschiedenen Arten (z. B. eine, die auf dem Bildschirm drucken, eine, die in Datei, eine speichert, die in DB speichert, ...). Meine Herausforderung - ich bin mir nicht sicher, wie die Verbraucher am besten skaliert werden können. Wenn ich andere Consumer vom gleichen Typ hinzufüge - bekomme ich doppelte Logs oder doppelte Einträge in der DB. ... (Denken Sie daran, dass zwei DB-Verbraucher denselben Fanout-Austausch verbrauchen).

Ich denke, ich kann einen Verbraucher erstellen, der in einer Arbeitswarteschlange veröffentlicht, aber ich frage mich, ob es eine bessere "eingebaute" Lösung in Rabbitmq gibt.

Vielen Dank im Voraus, zf

Antwort

0

Wenn Sie müssen die Verbraucher, um skalieren schneller die Nachrichten alle aus dem Sie benötigen competive raubend Fanout Austausch kommen zu konsumieren; Sie müssen also mehr Verbraucher an dieselbe Warteschlange binden, die an den Fanout-Austausch gebunden ist.
Auf diese Weise wird jeder Verbraucher einen Stapel von Nachrichten unabhängig von den anderen konsumieren. Die Anzahl der Nachrichten im Stapel wird mit der Eigenschaft prefetch count (http://www.rabbitmq.com/consumer-prefetch.html) definiert.
Auf diese Weise sollten Sie in der Lage sein, Benutzer zu skalieren, die Doppelprotokolle und doppelte Einträge in der DB vermeiden.

+0

Das ist offensichtlich, also ich denke, ich war nicht klar ... Ich entschuldige mich. Die Frage ist, wie man skaliert und dabei sicherstellt, dass von jeder Art von Konsumenten nur einer verarbeitet wird. Wenn ich zwei Arten von Consuners habe, tippe Typ1 und Typ2 und ich möchte, dass jede Nachricht von jedem Typ behandelt wird, aber nur einmal pro Typ. Ich kann einen Fanout-Austausch erstellen, der an 2 Arbeitswarteschlangen gesendet wird ... Gibt es eine andere Option? – user7412510

+0

Ich weiß nicht, ob ich Ihre Anfrage richtig verstanden habe, aber wenn Sie einen Fanout-Austausch mit jedem Verbraucher mit einer eigenen Warteschlange wünschen, können Sie nicht sicherstellen, dass eine einzelne Nachricht nur von einem Verbraucher verarbeitet wird. Der einzige Weg, den ich sehe, dass die Verbraucher skalieren können und sicher sein, dass nur eine von ihnen eine Nachricht konsumiert, ist, alle Verbraucher in einer einzigen Warteschlange an die Börse gebunden zu haben (und in diesem Fall könnte es direkt sein, es besteht keine Notwendigkeit eines Fanouts). Aber vielleicht bekomme ich nicht den ganzen Punkt, sorry, wenn meine Antwort dir nicht viel hilft :-) –

+0

'Ich kann einen Fanout-Austausch erstellen, der an 2 Arbeitswarteschlangen sendet .... Gibt es eine andere Option ? ' Gabriele

Verwandte Themen