Я использую RabbitMQ как очередь сообщений в сервис-ориентированной архитектуре, где многие отдельные веб-службы публикуют сообщения, связанные с очередями RabbitMQ. Эти очереди, в свою очередь, подписываются различными потребителями, которые выполняют фоновые работы; довольно ванильный вариант использования для RabbitMQ.
Теперь я хотел бы изменить некоторые параметры очереди (в частности, я хотел бы привязать очереди к новому обмену мертвыми буквами с определенным ключом маршрутизации). Моя проблема заключается в том, что внесение такого изменения в производственную систему проблематично по нескольким причинам.
Каков наилучший способ перехода на эти новые очереди без потери сообщений в производственной системе?
Я рассмотрел все из имен очереди версий, чтобы создать новый vhost с новыми настройками для выполнения всех изменений.
Вот некоторые из проблем, с которыми я сталкиваюсь:
-
Поскольку очереди RabbitMQ являются идемпотентными, разрозненные веб-службы объявляют очереди перед публикацией (если они еще не существуют). Как только вы измените параметры очереди (но сохраните один и тот же ключ маршрутизации), объявляет очередь, и RabbitMQ закрывает канал.
-
Я бы не потерял сообщения при изменении очереди (здесь я планирую подписку на эксклюзивный потребитель, который сохраняет сообщения, а затем переиздается в новую очередь).
-
Общая координация между разрозненными издателями и потребительской базой (или, что еще лучше, способ избежать необходимости их координировать).