Как справиться с сине-зеленым развертыванием с RabbitMQ?

В нашей облачной среде при развертывании нового экземпляра мы запускаем интеграционные тесты. Однако это усложняется тем, что новый код внедряет сообщения в очередь для развертываемой службы, в то время как существующие экземпляры (предыдущая версия) все еще работают. У нас есть сине-зеленое размещение.

Возможно ли, чтобы RabbitMQ имел много слушателей, слушающих очередь, НО только для определенной версии?

Например, все работающие серверы будут читать сообщения для версии 2017.10.20 (предыдущая версия) или более старых версий, но они не будут читать сообщения для более новых версий.

Таким образом, я мог развернуть новый сервис, и ни одна из других капель не прочитала бы его тестовые сообщения.

Развертываемая новая служба имеет те же функциональные возможности, что и существующие службы. Он создает и использует те же типы сообщений, что и текущие службы.

1 ответ

Решение

Похоже, у вас есть смесь тестовых и производственных сообщений в одной очереди. Если это правильно, я думаю, вы должны отделить их. Решением может быть - вы развертываете свои новые сервисы, которые публикуют / подписываются на integration test набор очередей, отличных от производственных. Когда вы довольны интеграционными тестами, вы переключаете свои экземпляры в pub / sub в производственные очереди (например, отправляя им командное сообщение с новым именем маршрута / очереди) или просто создаете эти тестовые очереди новыми производственными, и удаляете старый набор услуг вместе со своими очередями.

Например: у вас текущая версия 3.1, она публикует / подписывает на очереди / маршруты, например my_command_a_3.1, my_command_b_3.1 и т.д. Затем вы развертываете новую версию среды 3.2 для параллельной работы с версией 3.1. Все сервисы работают на очереди / маршруты my_command_a_3.2 а также my_command_b_3.2, Затем, когда вы довольны версией 3.2, вы удаляете свою версию 3.1 вместе с ее очередями. Сначала вам нужно будет слить эти очереди (сначала отключить производителей, ждать истощения очередей и отключить потребителей) .

Самый близкий прямой ответ на ваш вопрос, который я могу придумать: вы можете заставить своего потребителя записать сообщение, если потребитель не поддерживает версию сообщения (вам нужно будет указать версию в самом сообщении), попросив брокера запросить его. Затем в какой-то момент он будет обработан потребителем новой версии (в какой-то момент алгоритм циклического пересылки доставит это новое сообщение новому потребителю) . Это грязно, на мой взгляд, потому что это создает дополнительную бесполезную работу на стороне брокера, и для любого сообщения вы не знаете, когда оно будет фактически обработано и сколько раз оно будет помещено в очередь.

Другие вопросы по тегам