Frage

I selektiv zu löschen Nachrichten aus einer Warteschlange AMQP sie, ohne auch nur lesen möchten.

Das Szenario ist wie folgt:

Seite senden will Nachrichten vom Typ X abläuft basierend auf der Tatsache, dass neue Informationen vom Typ X angekommen. Da es sehr wahrscheinlich ist, dass die Teilnehmer nicht letzte Nachricht vom Typ X verbrauchen noch, Verlag sollte nur vorherige X-Typ-Nachrichten löscht und eine neuesten in die Warteschlange gestellt. Die gesamte Operation sollte für die Teilnehmer transparent sein -. In der Tat er etwas so einfach verwenden sollte als STOMP die Nachrichten zu erhalten

Wie es tun AMQP verwendet? Oder vielleicht ist es bequemer in einem anderen Messaging-Protokoll?

Ich möchte eine komplizierte Infrastruktur zu vermeiden. Das gesamte Messaging ist so einfach erforderlich, wie oben. Eine Warteschlange, ein Teilnehmer, ein Verleger, aber der Verleger muss die Fähigkeit, Ad-hoc hat das Löschen der Nachrichten für ein bestimmten Kriterien

Der Verlag Client Rubin verwenden, aber eigentlich würde ich mit jeder Sprache beschäftigen, sobald ich herausfinden, wie es in dem Protokoll zu tun.

War es hilfreich?

Lösung

Sie können derzeit nicht tun dies in RabbitMQ (oder allgemeiner, in AMQP) automatisch. Aber hier ist eine einfache Abhilfe.

Lassen Sie uns sagen möchten, dass Sie drei Arten von Nachrichten senden: Xs, Ys und Zs. Wenn ich Ihre Frage richtig verstanden habe, wenn eine X-Nachricht eintrifft, möchten Sie der Makler alle anderen X-Nachrichten vergessen, die nicht zugestellt worden sind.

Das ist ziemlich einfach, in RabbitMQ zu tun:

  • erklärt die Hersteller drei Warteschlangen: X, Y, und Z (sie sind als Routing-Schlüssel mit ihren Namen auf den Standardaustausch automatisch gebunden, das ist genau das, was wir wollen),
  • , wenn eine Nachricht zu veröffentlichen, spült der Hersteller zunächst die entsprechende Warteschlange (so, wenn es eine X-Nachricht ist die Veröffentlichung, es spült zuerst die X-Warteschlange); dies effektiv entfernt die veralteten Nachrichten,
  • der Verbraucher verbraucht einfach aus der Warteschlange es will (X für X-Nachrichten, Y für Y-Nachrichten, etc.); aus seiner Sicht, es hat nur ein basic.get zu tun, um die nächste relevante Nachricht zu erhalten.

Dies bedeutet eine Race-Bedingung, wenn zwei Hersteller die gleiche Art von Nachricht an dem etwa zur gleichen Zeit senden. Das Ergebnis ist, dass sein möglich, dass die eine Warteschlange zwei (oder mehr) Nachrichten zur gleichen Zeit, aber da die Anzahl der Nachrichten wird durch die Anzahl der Hersteller obere begrenzt, und da die überflüssigen Nachrichten auf dem gespülten werden als nächstes veröffentlichen , soll dies nicht wirklich ein Problem sein.

Um es zusammenzufassen, diese Lösung hat nur einen zusätzlichen Schritt von der optimalen Lösung, nämlich Säuberung Warteschlange X bevor Sie eine Nachricht vom Typ X veröffentlicht.

Wenn Sie Hilfe benötigen diese Konfiguration einrichten, der perfekte Ort, um Rat zu fragen ist die rabbitmq-discuss Mailing-Liste.

Andere Tipps

Sie wollen nicht eine Nachrichtenwarteschlange, möchten Sie einen Schlüssel-Wert-Datenbank. Zum Beispiel könnten Sie Redis oder Tokyo Tyrant verwenden eine einfache Netzwerk zugängliche Schlüssel-Wert-Datenbank zu erhalten. Oder einfach nur ein memcache verwenden.

Jeder Nachrichtentyp ist ein Schlüssel. Wenn Sie eine neue Nachricht mit dem gleichen Schlüssel zu schreiben, den vorherigen Wert überschreibt, so wird der Leser dieser Datenbank nie in der Lage sein, Informationen zu bekommen veraltet.

An diesem Punkt müssen Sie nur eine Nachrichtenwarteschlange, den Auftrag zu etablieren, in dem Schlüssel gelesen werden soll, wenn das wichtig ist. Ansonsten nur scannen kontinuierlich die Datenbank. Wenn Sie ständig die Datenbank scannen kann, ist es am besten, um die Datenbank in der Nähe der Leser setzen den Netzwerkverkehr zu reduzieren.

Ich würde wahrscheinlich etwas tun key: typecode value: lastUpdated, important data

Dann würde ich Nachrichten senden, die enthalten typecode, lastUpdated Auf diese Weise kann der Leser vergleicht für diesen Schlüssel zu den einem Lastupdated, dass sie zuletzt gelesen aus der Datenbank und überspringen sie zu lesen, da sie bereits auf dem neuesten Stand sind.

Wenn Sie wirklich dieses mit AMQP müssen tun, dann verwenden RabbitMQ und einen benutzerdefinierten Austauschtyp, speziell eine letzten Wert Cache Börse. Beispielcode ist hier https://github.com/squaremo/rabbitmq-lvc-plugin

Es scheint, von dem RabbitMQ Web-UI auch arbeiten, wenn Sie sich n Nachrichten aus der Warteschlange

entfernen mögen
  • Wählen Sie die Warteschlange aus dem Reiter „Queues“, scrollen Sie zum Abschnitt „Get-Nachrichten“
  • set Parameter „Requeue = Nein“ und Anzahl der Nachrichten, wollen Sie aus der Warteschlange
  • entfernen
  • drücken Sie "Get-Nachrichten" Taste

Diese Frage hat eine hohe Sichtbarkeit durch den Titel davon. Geht man durch die Beschreibung wohnt mit spezifischeren Szenario. Also für diejenigen Anwender, die wirklich suchen, um die nächste (nicht vergessen, FIFO) Nachricht aus der Warteschlange zu löschen, können Sie die Verwendung von rabbitmqadmin und geben Sie die folgenden Befehl ein:

rabbitmqadmin get queue=queuename requeue=false count=1

Dieser Befehl verbraucht im Wesentlichen die Nachricht und nichts zu tun. Ein vollständiger Befehl mit Flagge nehmen Sicherung der Nachricht (en) wie die folgenden aussehen könnte. Stellen Sie sicher, dass alle anderen Parameter hinzuzufügen, wie pro Ihre Anforderung.

sudo python rabbitmqadmin -V virtualhostname -u user -p pass get queue=queuename requeue=false count=1 payload_file=~/origmsg

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top