RabbitMQ搭配Celery处理任务时如何查看队列内的任务内容?
问题背景
我在Django应用中基于RabbitMQ与Celery搭建了基础消息任务队列,按照认知,调用delay方法会将任务推送至RabbitMQ队列,随后Celery工作节点会从队列拉取任务执行。我希望在调用delay推送任务后,能在RabbitMQ管理门户查看到队列中的对应任务,但任务几乎会被瞬时拉取处理,没有机会在管理门户观测到。
已尝试操作
我曾尝试在任务方法中添加sleep计时器来延长任务停留时间,具体操作如下:
- 编辑tasks.py文件,执行命令:
sudo nano tasks.py
写入代码:from __future__ import absolute_import, unicode_literals from celery import shared_task import time @shared_task def add(x, y): time.sleep(100) return x + y - 启动Celery应用,执行命令:
(myprojectenv) root@ubuntu-s-1vcpu-1gb-blr1-01:/etc/myproject# celery -A myproject worker -l info - 推送任务执行,进入Django shell操作:
(myprojectenv) root@ubuntu-s-1vcpu-1gb-blr1-01:/etc/myproject# python3 manage.py shell Python 3.8.10 (default, Mar 15 2022, 12:22:08) [GCC 9.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> from app1.tasks import add >>> add.delay(1,2)
此时Celery运行窗口显示已成功接收任务,日志如下:
[2022-06-10 06:16:15,182: INFO/MainProcess] celery@ubuntu-s-1vcpu-1gb-blr1-01 ready. [2022-06-10 06:17:38,485: INFO/MainProcess] Task app1.tasks.add[be566921-b320-466c-b406-7a6ed7ab06e7] received
但我始终无法在RabbitMQ管理门户的队列中看到对应任务内容,查看的队列页面中对应队列的Ready消息数始终为0,看不到具体任务详情。
问题原因
在任务函数中添加time.sleep(100)无法让任务停留在RabbitMQ队列中。sleep逻辑是任务被Celery worker拉取到本地执行阶段才会触发,和任务在RabbitMQ队列中的停留时长没有任何关系。只要Celery worker处于正常运行状态,就会第一时间拉取队列中的待消费任务,队列里不会有堆积的待执行消息,自然看不到对应任务。
正确查看队列任务的操作方案
按以下步骤操作即可在RabbitMQ管理门户观测到队列中的任务:
- 第一步:终止所有正在运行的Celery worker进程,确保没有消费者监听目标队列,执行命令
pkill -f "celery worker"即可批量关闭所有Celery工作进程。 - 第二步:重新进入Django shell,调用
add.delay(1,2)推送任务。此时因为没有消费者拉取消息,任务会持久化留在RabbitMQ的对应队列中。 - 第三步:打开RabbitMQ管理门户(默认地址为
http://服务器IP:15672),进入Queues标签页,找到Celery默认使用的队列(通常命名为celery),点击队列名进入详情页。 - 第四步:在详情页找到Get messages板块,将Messages参数设置为需要查看的消息数量(例如填1),Requeue参数必须选择Yes(如果选No会直接将消息从队列中移除,导致后续worker无法执行该任务),点击
Get Message(s)按钮,即可看到队列中存储的完整任务内容,包括任务ID、对应执行函数、传入参数等信息。
补充提示:已经被worker拉取、正在执行的任务不会存在于RabbitMQ队列中,这类运行中任务的状态不要在RabbitMQ管理页查找,可以通过Celery官方监控工具flower查看。
内容的提问来源于stack exchange,提问作者Himanshu Poddar
相关产品推荐
相关产品推荐

