Использование RabbitMQ 3.7.16
, spring-amqp 2.2.3.RELEASE
.
Несколько клиентов публикуют sh сообщений для обмена DataExchange
topi c на нашем сервере RabbitMQ с использованием уникального ключа маршрутизации. При отсутствии каких-либо привязок, обмен перенаправит все сообщения на data.queue.generic
через AE.
Когда определенный клиент (идентификатор клиента 1
и 2
на диаграмме) публикует много сообщения, чтобы масштабировать потребление их сообщений независимо от других клиентов, мы начинаем потребителей и назначаем им обработку только их идентификатора клиента. Чтобы достичь этого, каждый клиент-потребитель определяет новую очередь и связывает ее с обменом topi c с помощью ключа маршрутизации events.<clientID>
.
Таким образом, масштабирование покрыто и работает хорошо.
Теперь, когда частота сообщений для этого клиента снижается, мы хотели бы также уменьшить количество его потребителей, вплоть до удаления всех из них. Намерение состоит в том, чтобы все эти сообщения были направлены в GenericExchange
, где есть пул общих c потребителей, которые заботятся о них.
Проблема заключается в том, что если я delete data.queue.2
(чтобы удалить привязку, которая приведет к перенаправлению новых сообщений на GenericExchange
), все ожидающие сообщения будут потеряны.
Вот упрощенное представление архитектуры:
Было бы приемлемым решением позволить истечению срока действия сообщений с TTL в очереди клиента, а затем переслать их в общий обмен c, но затем Мне также нужно остановить обмен topi c от маршрутизации новых сообщений в эту «умирающую» очередь.
Итак, какие опции у меня есть, чтобы остановить обмен topi c от маршрутизации сообщения в очередь клиента, где теперь нет подключенного к нему потребителя?
Или изучить другой путь - как перевести сообщения в виде удаленных писем в удаленную / просроченную очередь?