Python 芹菜任务是什么意思;收到“;?当所有芹菜工人都被阻止时,新的任务发生了什么;收到“;?
我正在开发一个新的监控系统,该系统可以测量芹菜队列吞吐量,并在队列备份时帮助提醒团队。在我的工作过程中,我遇到了一些我不理解的特殊行为(在芹菜规范中也没有很好的记录) 出于测试目的,我设置了一个端点,该端点将使用几个长时间运行的任务填充队列,这些任务可用于模拟备份队列。框架是Flask,队列代理是Redis。芹菜是为每个工人配置的,可以并行处理多达4个任务,我有2个工人在运行 api/health.pyPython 芹菜任务是什么意思;收到“;?当所有芹菜工人都被阻止时,新的任务发生了什么;收到“;?,python,celery,flower,Python,Celery,Flower,我正在开发一个新的监控系统,该系统可以测量芹菜队列吞吐量,并在队列备份时帮助提醒团队。在我的工作过程中,我遇到了一些我不理解的特殊行为(在芹菜规范中也没有很好的记录) 出于测试目的,我设置了一个端点,该端点将使用几个长时间运行的任务填充队列,这些任务可用于模拟备份队列。框架是Flask,队列代理是Redis。芹菜是为每个工人配置的,可以并行处理多达4个任务,我有2个工人在运行 api/health.py def health(): health = Blueprint("hea
def health():
health = Blueprint("health", __name__)
@health.route("/api/debug/create-long-queue", methods=["GET"])
def long_queue():
for i in range(16):
sleepy_job.delay()
return make_response({}, 200)
return health
@celery.task(priority=HIGH_PRIORITY)
def sleepy_job(*args, **kwargs):
time.sleep(30)
jobs.py
def health():
health = Blueprint("health", __name__)
@health.route("/api/debug/create-long-queue", methods=["GET"])
def long_queue():
for i in range(16):
sleepy_job.delay()
return make_response({}, 200)
return health
@celery.task(priority=HIGH_PRIORITY)
def sleepy_job(*args, **kwargs):
time.sleep(30)
下面是我模拟备份生产队列的步骤:
/api/debug/create long queue
来模拟队列中的备份。根据上述数学,工人们应该每个忙着睡1分钟(加在一起,他们一次可以同时处理8项任务,每个任务只睡30秒,总共有16项任务)- 虽然所有工作人员都被前8个
任务阻止,但我在队列上没有看到新的sleepy\u作业
的迹象,即使我确定handle\u incoming\u消息
已作为第二次API调用的结果被调用handle\u incoming\u message.delay()
- 在前8个
任务完成后(~30秒),我在队列上看到新的sleepy_作业
,状态为handle_incoming_消息
received
- 在第二个(也是最后一个)8
任务完成后,我现在看到sleepy_作业
的状态已启动(我可以确认这一点,因为UI将使用该任务中接收和处理的新数据进行更新。)handle_incoming_message
睡眠作业
任务后暂时解锁时,他们正在以flower可见的方式标记/确认新的处理传入消息
任务但这留下了几个悬而未决的问题:
- 当工作进程被阻止时,新的
处理传入消息
任务的状态是什么
- 解除阻止工作进程后发生了哪些变化,使得flower现在可以看到新的
处理传入消息
任务
- “接收”状态实际上是什么意思
- (额外好处:在阻止工作人员时,如何查看排队的任务?)
非常感谢Dejan,这非常有用。鉴于这些限制,端到端芹菜队列监控(更重要的是警报)的最佳实践是什么?例如,我希望在从
.delay()
到任务成功的平均时间大于30秒时收到通知。(我知道我们经常会超过这一限制,而我认为分类的第一步是至少知道它何时发生。)[我阅读了链接帖子,但似乎没有任何一种解决方案脱颖而出。在这方面真的没有行业标准吗?对许多公司来说,这似乎是一个大问题。]在我工作的公司,我们自己编写了通知系统,它基于我在关于花卉的一段中提到的相同的监控机制。。。