Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

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

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