在从 RabbitMQ 队列开始部署之前删除消费者

在从 RabbitMQ 队列开始部署之前删除消费者

我们设置了具有 8 个节点的 Celery 工作器。它在 RabbitMQ 中创建了 8 个队列。

当我们开始部署新的更改时,ansible playbook 中的最后一步是 Celery 重启。

Celery 重启必须关闭每个节点并启动该节点。但是,由于有继续消息进入队列并被工作节点使用,因此需要更多时间来重启 Celery 工作节点。

我认为,如果我们在开始部署时将消费者从 Celery 工作队列中删除,那么 Celery 节点将不会消费更多消息,而只会处理已消费的消息。这样,Celery 可能会快速重启。

我不确定,我正在朝着正确的方向思考,但我必须celery worker restart比现在更快地处理。

目前,完成该步骤需要 2-3 小时。有时 ansible 会丢失连接,jenkins 作业会更新状态并显示作业失败。

如果有更好的方法,请告诉我。

答案1

听起来你只需要改变你的工作代码中的逻辑来停止接受新消息,或者直接关闭。只要你正确使用 RabbitMQ 队列的确认功能,最坏的情况是你的消息永远不会被确认已经被处理并且被放回到队列中重新处理。

但是,如果在处理消息时存在其他可能导致重复的因素,则此方法不起作用,例如,如果您向数据库添加 SQL 记录。

相关内容