У нас есть настройка Celery worker с настройкой 8 узлов. Он создает 8 очередей в RabbitMQ.
Когда мы начинаем развертывать новые изменения, последним шагом в доступном playbook является перезапуск Celery.
При перезапуске сельдерея необходимо отключить каждый узел и запустить этот узел. Но есть сообщения продолжения, поступающие в очередь и потребляемые рабочим узлом, поэтому для перезапуска рабочего сельдерея требуется больше времени.
Я подумал, что если мы удалим потребителя из рабочей очереди сельдерея при запуске развертывания, тогда узел сельдерея не будет потреблять больше сообщений и будет обрабатывать только те сообщения, которые уже потреблены. Таким образом, это может быть быстрый перезапуск сельдерея.
Я не уверен, я думаю в правильном направлении, но мне нужно обработать celery worker restart
быстрее, чем его обработка сейчас.
На данный момент на выполнение этого шага уходит 2-3 часа. Некоторое время недоступное потеряло соединение и статус обновления задания Дженкинса с неудавшейся работой.
Если есть лучший способ сделать это, дайте мне знать.
Похоже, вам просто нужно изменить логику в вашем рабочем коде, чтобы либо перестать принимать новые сообщения, либо просто полностью отключиться. Пока вы правильно используете функцию подтверждения очередей RabbitMQ, в худшем случае ваше сообщение никогда не будет подтверждено для были обработаны и снова помещены в очередь на повторную обработку.
Хотя это не сработает, если в обработке сообщения есть другие факторы, которые могут вызвать дублирование, например, если вы добавляете запись SQL в базу данных.