Удалить потребителя перед началом развертывания из очереди RabbitMQ

У нас есть настройка Celery Worker с настройкой 8 узлов. Это создает 8 очередей в RabbitMQ.

Когда мы начинаем развертывать новые изменения, последний шаг в ANSIBLE Playbook - перезапуск Celery.

Перезапуск сельдерея должен завершить работу каждого узла и запустить этот узел. Но есть продолжающиеся сообщения, поступающие в очередь и потребляемые рабочим узлом, для перезапуска работника сельдерея требуется больше времени.

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

Я не уверен, я думаю в правильном направлении, но я должен обработать celery worker restart быстрее, чем то, что его обработка сейчас.

На данный момент требуется 2-3 часа, чтобы завершить этот шаг. Некоторое время назад можно потерять соединение и статус обновления задания Дженкинса с ошибкой задания.

Если есть лучший способ сделать это, дайте мне знать.

1 ответ

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

Хотя это не сработает, если в обработке сообщения есть другие факторы, которые могут вызвать дублирование, например, если вы добавите запись SQL в базу данных, например.

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