2009-07-16 8 views
3

Ich habe ein System, das sporadisch Nachrichten generieren wird, und ich möchte nur alle 5 Minuten entweder Null oder eine Nachricht senden. Wenn keine Nachricht generiert wird, wird vom Warteschlangencustomer nichts verarbeitet. Wenn 100 identische Nachrichten innerhalb von 5 Minuten erzeugt werden, möchte ich nur einen von diesen aus der Warteschlange verbrauchen.AMQP Delay Delivery und doppelte Nachrichten verhindern

Ich benutze AMQP (RabbitMQ), gibt es eine Möglichkeit, dies innerhalb Rabbitmq oder das AMQP-Protokoll zu erreichen? Kann ich den Inhalt einer Warteschlange überprüfen, um sicherzustellen, dass kein Duplikat eingefügt wird? Es scheint, dass die Warteschlangeninspektion eine schlechte Idee ist und nicht typischerweise, was für ein Nachrichtensystem getan werden sollte.

Ohne Warteschlangenprüfung, kann dies mit diesen Tools erreicht werden? Die einzige Lösung, die Ihnen in den Sinn kommt, ist eine zweite Warteschlange, die alle Nachrichten aufnimmt. Anschließend liest der Konsument jede Nachricht und legt sie in eine interne Warteschlange, wartet 5 Minuten und doppelte Nachrichten werden verworfen. Nach der Verzögerung wird die einzelne Nachricht in die "echte" Warteschlange zur Verarbeitung gebracht.

Es scheint, als wäre dies eine häufige Situation, die ein Warteschlangensystem bewältigen könnte. Irgendwelche Ideen?

Antwort

2

Die Handhabung des Nachrichtenstatus ist nicht etwas, mit dem AMQP zu tun hat. Sie könnten versuchen, den Zustand in einem Prozess zu behandeln, der auch auf den AMQ- und Proxy-Nachrichten vorhanden ist (wie Sie in Ihrer ursprünglichen Frage geschrieben haben). Abhängig von Ihrer Situation könnten Sie vielleicht Sequenzen oder ausgeklügeltere Mittel zur staatenlosen Duplikaterkennung verwenden, aber AMQP behandelt diesen speziellen Anwendungsfall nicht.

Die einzige Sache, die garantiert ist, ist, dass, wenn mehrere Bindungen eine Nachricht übereinstimmen, die anschließend an eine Warteschlange geliefert wird, nur eine Nachricht tatsächlich zugestellt wird.