В настоящее время вы не можете делать это в RabbitMQ (или, в более общем случае, в AMQP) автоматически. Но вот простой способ.
Допустим, вы хотите отправить три типа сообщений: Xs, Ys и Zs. Если я правильно понимаю ваш вопрос, когда приходит сообщение X, вы хотите, чтобы брокер забыл все остальные сообщения X, которые не были доставлены.
Это довольно легко сделать в RabbitMQ:
- производитель объявляет три очереди: X, Y и Z (они автоматически привязываются к обмену по умолчанию со своими именами в качестве ключей маршрутизации, а это именно то, что нам нужно),
- при публикации сообщения производитель сначала удаляет соответствующую очередь (поэтому, если он публикует сообщение X, он сначала очищает очередь X); это эффективно удаляет устаревшие сообщения,
- потребитель просто потребляет из очереди, которую хочет (X для сообщений X, Y для сообщений Y и т. Д.); с его точки зрения, он просто должен сделать basic.get, чтобы получить следующее соответствующее сообщение.
Это подразумевает состояние гонки, когда два производителя отправляют сообщения одного типа примерно в одно и то же время. В результате очередь может иметь два (или более) сообщения одновременно, но количество сообщений ограничено числом производителей, а лишние сообщения удаляются при следующей публикации. это не должно быть большой проблемой.
Подводя итог, у этого решения есть только один дополнительный шаг от оптимального решения, а именно, очередь очистки X перед публикацией сообщения типа X.
Если вам нужна помощь в настройке этой конфигурации, идеальным местом для консультации является список рассылки rabbitmq-обсуждения.