Wie selektives löschen von Nachrichten aus einem AMQP (RabbitMQ) - Warteschlange?
Ich würde gerne selektives löschen von Nachrichten aus einem AMQP-Warteschlange ohne auch Sie zu Lesen.
Das Szenario ist wie folgt:
Versenden Seite will expire Nachrichten des Typs X basiert auf einer Tatsache, dass neue Informationen vom Typ X ist angekommen. Denn es ist sehr wahrscheinlich, dass die Abonnenten nicht konsumieren neueste Nachricht vom Typ X noch, die publisher sollten einfach löschen vorherigen X-type-Nachrichten und setzen einen neuen ein in die Warteschlange. Der ganze Vorgang sollte transparent sein, um die Abonnenten - in der Tat er sollte etwas so einfaches wie STOMP zu Holen Sie sich die Nachrichten.
Wie man es AMQP? Oder vielleicht ist es bequemer, in einem anderen messaging-Protokoll?
Möchte ich vermeiden Sie eine komplizierte Infrastruktur. Die ganzen messaging Bedarf ist so einfach wie oben: eine Warteschlange, Abonnenten, publisher, aber die publisher müssen haben die Fähigkeit zu ad-hoc-löschen der Nachrichten für eine bestimmte Kriterien.
Der publisher-client wird die Verwendung von Ruby, aber eigentlich würde ich Probleme mit der Sprache, sobald ich entdecken, wie es in dem Protokoll.
InformationsquelleAutor Wojciech Kaczmarek | 2010-08-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie dies derzeit in RabbitMQ (oder allgemeiner, in der AMQP) automatisch. Aber, hier ist eine einfache Abhilfe.
Lassen Sie uns sagen, Sie möchten, senden Sie drei Arten von Nachrichten: Xs, Ys und Zs. Wenn ich verstehe deine Frage richtig, wenn eine X-Nachricht eintrifft, wollen Sie die broker zu vergessen alle anderen X-Nachrichten, die noch nicht geliefert worden.
Dies ist ziemlich einfach zu tun, RabbitMQ:
Bedeutet dies eine race-Bedingung, wenn zwei Produzenten senden die gleiche Art von Nachricht, zu der etwa die gleiche Zeit. Das Ergebnis ist, dass Ihre möglichen, für das Sie eine Warteschlange zu haben, die zwei (oder mehr) Nachrichten zur gleichen Zeit, da aber die Anzahl der Meldungen ist oben begrenzt durch die Anzahl der Produzenten, und da das überflüssige Nachrichten werden gelöscht auf der nächsten veröffentlichen, dies sollte nicht viel von einem problem.
Zusammenfassen, diese Lösung hat nur einen extra-Schritt die optimale Lösung, nämlich purge-queue-X, die vor der Veröffentlichung einer Nachricht des Typs X.
Wenn Sie benötigen Hilfe bei der Einrichtung dieser Konfiguration ist der perfekte Ort, um Rat zu Fragen, ist das rabbitmq-discuss mailing-Liste.
Ah. Hören Sie Tausende von Warteschlangen wäre kein problem gewesen (es ist fast kein Aufwand). Sie können nicht wirklich selektiv löschen von Nachrichten wenn Sie auf eine Warteschlange. Es fällt mir auf, dass das, was Sie wollen, ist ein fileserver unterstützt Atomare Operation: publisher startet wrtiting in eine temporäre Datei, und wenn es fertig ist, bewegt (benennt), dass die Datei X; der client dann nur die Datei liest, X.
InformationsquelleAutor scvalex
Sie nicht möchten, dass eine message-queue, die Sie möchten, dass ein Schlüssel-Wert-Datenbank. Zum Beispiel könnten Sie verwenden Redis oder Tokyo Tyrant, um eine einfache Netzwerk-zugänglichen Schlüssel-Wert-Datenbank. Oder verwenden Sie einfach einen memcache.
Jeden message-Typ ist ein Schlüssel. Beim schreiben einer neuen Nachricht mit dem gleichen Schlüssel, überschreibt es den vorherigen Wert, so dass der Leser diese Datenbank wird nie in der Lage sein, um die out-of-date Informationen.
Zu diesem Zeitpunkt, brauchen Sie nur eine message-queue zu etablieren, die die Reihenfolge, in der keys gelesen werden sollte, falls das wichtig ist. Ansonsten halt ständig Scannen der Datenbank. Wenn Sie ständig Scannen die Datenbank, am besten ist es, die Datenbank in der Nähe der Leser, um Netzwerkverkehr zu reduzieren.
Ich würde wahrscheinlich etwas wie das hier tun
key: typecode
value: lastUpdated, important data
Dann würde ich Nachrichten senden, enthalten
typecode, lastUpdated
So kann der Leser vergleichen, lastupdated für die Taste, um die eine, die Sie zuletzt von der Datenbank gelesen und überspringen Sie Lesen es, weil Sie bereits auf dem neuesten Stand.Wenn Sie wirklich brauchen, um dies zu tun mit AMQP, dann verwenden RabbitMQ und eine benutzerdefinierte exchange-Typ, insbesondere den Letzten Wert der für Cache Exchange. Der Beispiel-code ist hier https://github.com/squaremo/rabbitmq-lvc-plugin
InformationsquelleAutor Michael Dillon
Diese Frage hat eine hohe Sichtbarkeit durch die Titel. Sie gehen durch die Beschreibung wohnt mit mehr spezifische Szenario.
Also für diejenigen Benutzer, die schauen, um tatsächlich löschen Sie die nächsten (denken Sie daran FIFO) Nachricht aus der Warteschlange, können Sie Gebrauch machen von rabbitmqadmin und geben Sie den nachstehenden Befehl:
rabbitmqadmin get queue=queuename requeue=false count=1
Dieser Befehl ist im wesentlichen konsumieren die Nachricht und nichts zu tun. Ein kompletter Befehl mit flag Sicherung der Nachricht(en) Aussehen könnte, wie die unten. Stellen Sie sicher, dass Sie alle anderen Parameter wie pro Ihre Anforderung.
sudo python rabbitmqadmin -V virtualhostname -u user -p pass get queue=queuename requeue=false count=1 payload_file=~/origmsg
InformationsquelleAutor J4R
Scheint es zu funktionieren, auch von der RabbitMQ-Web-UI, wenn Sie nur wollen, zu entfernen, die ersten n Nachrichten aus der Warteschlange
InformationsquelleAutor Radimar