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