2016-10-26 2 views
0

Ich versuche RabbitMQ in einer unkonventionellen Art und Weise zu verwenden (obwohl ich an dieser Stelle andere Nachrichtenwarteschlange Implementierung holen kann, wenn erforderlich)Verwaltung Sperre auf masssage in Kaninchen mq

meine Anwendung wie diese arbeitet, i habe eine Warteschlange (ich kann mehr haben, wenn nötig), dass mant Kunden N Nachrichten asynchron holt. Nachdem sie ihre Arbeit erledigt haben, sende ich die Ergebnisse vom Client an die db.

Ich habe zwei Probleme: erstens möchte ich nicht, dass sie an der gleichen Nachricht arbeiten, zweitens möchte ich, dass ich keine Nachrichten verlieren, falls mein Kunde den Browser schließt oder einfach nicht mehr funktioniert.

Ich schaute auf die Dokumentation und sah die TTL, die für mich perfekt war, wenn ich diese Nachricht ändern konnte, die Timeout wird nicht gelöscht werden, sondern um in eine andere Warteschlange zu verschieben. kann keinen Weg finden, dies zu ändern.

Darüber hinaus schaute ich auf die Bestätigungsoption, die auf den ersten Blick sah, was ich wollte, dass der Mechanismus so funktioniert: wenn der Verbraucher eine Nachricht erhält, sendet er eine Bestätigung in die Warteschlange, ich dachte, ich kann diese Bestätigung verzögern und senden wenn die Arbeit auf der Client-Seite erledigt ist. Mein Problem war, dass ich die Warteschlange nicht programmieren kann, wenn eine Nachricht nicht bestätigt wurde, dann zurück in die Warteschlange (oder zu einem anderen).

Ich finde auch, wie man eine geplante Nachricht tut, aber es hat auch nicht geholfen, weil ich nicht will, dass die Nachricht in die Warteschlange in fünf Minuten eingefügt wird, möchte ich, wenn ein Kunde eine Nachricht erhalten wird wird für 5 min. in der Warteschlange gesperrt, bis das Löschen bestätigt wird, andernfalls wird es in die Warteschlange zurückgestellt.

kann ich temporäre Warteschlange tun, die meinen Mechanismus aktiviert?

Wenn jemand mit einem der Probleme helfen kann oder eine andere Architektur oder Option vorschlägt, es in einem anderen mq zu tun, wäre es großartig.

Ressourcen:

Bestätigung: http://www.rabbitmq.com/blog/2011/02/10/introducing-publisher-confirms/

Post über Schleusen, aber sein Problem war ein batcher Komponente: Locks and batch fetch messages with RabbitMq

TTL: https://www.rabbitmq.com/ttl.html

Plan eine Nachricht: https://www.rabbitmq.com/blog/2015/04/16/scheduling-messages-with-rabbitmq/

Antwort

0

Mein Problem war, dass ich die Warteschlange nicht programmieren kann, wenn eine Nachricht nicht bestätigt bekommen, dann zurück zur Warteschlange (oder zu einem anderen).

RabbitMQ tut dies ohnehin, so alles, was Sie tun müssen, ist die Auto-ack-Flag ausschalten, können Sie diese

heraus

Ich dachte, ich dies bestätigen verzögern kann und es senden, wenn die Arbeit done auf der Client-Seite.

also senden Sie einfach die ACK, sobald Sie mit der Verarbeitung der Nachricht fertig sind. Alle nicht bestätigten Nachrichten verbleiben in der Warteschlange und werden je nach Konfiguration erneut an den nächsten Kunden (oder den gleichen, wenn er wieder verfügbar ist) gesendet