2016-06-02 6 views
0

Ich habe ein solches Szenario, dass ich nicht sicher bin, ob Bunny unterstützen kann: Ich habe einen Producer, der regelmäßig Nachrichten produzieren. Und es gibt 3 Verbraucher. Da ich den RPC nachahmen möchte, also statt Fanout-Exchange zu verwenden, sendet mein Producer in jeder Runde drei Nachrichten an DirectExchange mit dem entsprechenden Routing-Schlüssel. Und der Verbraucher wird die Nachricht erhalten und auf die temporäre Antwortwarteschlange antworten. Die Frage ist also, mein Consumer ist nicht immer online (ich habe RAFT Consensus-Algorithmus implementiert). Aber wenn es online geht, kommen frühere "veraltete" Nachrichten, die von Producer gesendet wurden, einfach durch und mein Online-Verbraucher begann so viele RPC-Nachrichten zu verarbeiten, dass sie bereits ungültig sind, was meine Anwendungslogik sprengt. Gibt es eine Möglichkeit, eine Nachricht an DirectExchange zu senden, und wenn keine Warteschlange den Routing-Schlüssel abhört, wird die Nachricht einfach gelöscht? Ich überlege, einen Timestamp vor dem Senden zu machen und den Timestamp zu überprüfen, wenn er empfangen wird, aber das ist eindeutig keine gute Lösung, da die "veraltete Schwelle" schwer zu regeln ist. Vielen Dank Jungs! Jede Hilfe wird geschätzt.Wie mache ich eine Nachricht an DirectExchange automatisch gelöscht, wenn keine Warteschlange diesen Schlüssel hören

Antwort

0

Sie können message TTL verwenden. Vielleicht ist es sinnvoll, TTL auf 0 zu setzen.

die TTL auf 0 Ursachen Meldungen Einstellung bei Erreichen einer Warteschlange abgelaufen sein, wenn sie nicht sofort an einen Verbraucher geliefert werden kann.

Beachten Sie, dass dies pro Warteschlange und pro Nachricht eingestellt werden kann. Ich werde auch nur Einsprüche aus dem Link zitieren:

Während der Verbraucher nie abgelaufene Nachrichten sehen, nur wenn abgelaufene Nachrichten der Kopf einer Schlange erreichen sie tatsächlich verworfen werden (oder tot beschriftete). Beim Setzen einer TTL-Warteschlange pro Warteschlange ist dies kein Problem, da die abgelaufenen Nachrichten immer an der Spitze der Warteschlange stehen, . Bei der Einstellung pro Nachrichten-TTL können abgelaufene Nachrichten jedoch hinter nicht abgelaufenen Nachrichten auflaufen, bis diese verbraucht oder abgelaufen sind. Daher werden Ressourcen, die von solchen abgelaufenen Nachrichten verwendet werden, nicht freigegeben, und sie werden in Warteschlangenstatistiken (z. B. die Anzahl der Nachrichten in der Warteschlange) gezählt.