我遇到了一个用例,我想控制芹菜工人如何以及何时从Rabbitmq出发处理任务。出口将与芹菜环境中发生的外部事件同步,但我担心芹菜是否给我任何灵活性来控制任务的出列?我尝试调查,下面是一些可能性:
使用basic.get
代替basic.consume
,其中基于外部事件触发basic.get
。但是,我看到芹菜默认为basic.consume
(推送)语义。如果不直接修改核心,我可以覆盖此行为吗?
在触发外部事件时自定义远程控制工作人员。但是,从文档中我不太清楚远程控制命令如何帮助我控制任务的出列。
我非常倾向于继续使用芹菜,并且可能不会在AMQP之上编写自定义队列处理解决方案。
答案 0 :(得分:0)
使用远程控制命令,您可以从给定队列中pause or resume消息消费。
celery.control.cancel_consumer('celery')
上面的命令指示所有工作者停止从默认芹菜队列消耗(出列)消息
celery.control.add_consumer('celery')
远程命令接受 目标 参数,该参数允许向特定工作人员发送请求
答案 1 :(得分:0)
需要考虑的两个特殊选项:(1)在Rabbit层中定义自定义交换类型。这允许您创建路由规则,以控制将哪些任务发送到哪些队列。 (2)定义一个定制的Celery中介。这允许您控制从队列到工作池时移动的任务。