2016-07-13 6 views
0

Ich habe, was ich glaube, ein häufiger Anwendungsfall mit RabbitMQ: Worker Queues - Ein Server bekommt Anfragen von Benutzern und speichert sie in einer Warteschlange, um später zu behandeln. Das Problem ist, dass einige der Aufgabe zu einer Minute dauern kann, und so habe ich beschlossen, nicht Auto ack:Rabbitmq - Wie man mit Kanälen umgeht, wenn Nachrichten nicht automatisch gelöscht werden

GetResponse response = channel.basicGet(queueName, false); 

I ack wollen, wenn die Arbeit beendet hat

channel.basicAck(deliveryTag, false); 

Von dem, was ich weiß, : https://www.rabbitmq.com/confirms.html ("Senden einer basic.ack auf demselben Kanal" - Bestätigung sollte auf dem gleichen Kanal erfolgen, der die Nachricht empfangen hat).

Also entschied ich mich für eine Karte von Nachrichten an Kanäle (In meinem Anwendungsfall habe ich einen einzigen Kanal pro Nachricht). Jedes Mal, wenn die Nachricht fertig ist, antworte ich.

Ich denke, dieses Design ist sehr fehlerhaft. Es zwingt mich, einen Zustand in meinem Server zu speichern, und zwingt mich, einen Kanal pro Nachricht zu haben, anstatt Kanäle wiederzuverwenden.

Ich bin mir sicher, dass dies ein weit verbreiteter Anwendungsfall ist - was wäre: 1. Sollte ich lokale Threadkanäle verwenden? Wenn ja, ist es in Ordnung, Nachrichten in einem anderen Thread zu beantworten? 2. Gibt es eine bessere Möglichkeit, acking-Nachrichten zu verarbeiten als diese Nachricht zu speichern -> channel map?

Danke

Antwort

1

i mit Java nicht zu schrecklich vertraut bin, aber von dem, was ich verstehe, ist, einen einzelnen Kanal pro Gewinde richtig. Ich glaube nicht, dass Kanäle Thread-sicher sind.

zusätzlich Speichern der Kanal-ID (oder den Namen oder was auch immer es ist) und acking die Nachricht auf dem gleichen Kanal ist notwendig

ich persönlich nichts falsch mit dem hohen Niveau Überblick über sehen, was Sie zur Verfügung gestellt haben .

Sie haben jedoch Recht, dass ein "Kanal pro Nachricht" eine schlechte Idee ist. Es sollte Kanal pro Thread sein, und Sie können mehrere Nachrichten auf demselben Kanal und innerhalb desselben Threads konsumieren.

nur sicher sein, um die Nachricht auf dem Kanal ack, aus dem es

+0

Und wenn das Kanalobjekt verbraucht war irgendwie geschlossen ist, kann ich es wieder öffnen - mit connection.createChannel (Kanalnummer) - und ack es auf diesem Kanal ? – user967710

+0

Und auch - sind Kanäle nie geschlossen? – user967710

Verwandte Themen