我正在尝试将一个作业发布由2个(或N个)任务处理。在RabbitMQ中,这通常是通过扇出交换完成的。
芹菜有可能吗?
这是我当前的设置:
from celery import Celery
from kombu import Queue, Exchange
from time import sleep
app = Celery('hello', broker='amqp://guest@localhost//')
e = Exchange('hell', type='fanout')
app.conf.task_queues = (
Queue('default', routing_key='#'),
Queue('wow', exchange=e, routing_key='feed.#'),
Queue('great', exchange=e, routing_key='feed.#'),
)
app.conf.task_routes = {
'hello': {
'queue': 'wow',
},
'hello2': {
'queue': 'great'
},
}
@app.task(bind=True, queue='wow')
def hello(self, id):
print("hello: %s" % id)
return 1
@app.task(bind=True, )
def hello2(self, id):
print("hello2: %s" % id)
return 2
然后从其他地方呼叫:
from test1 import hello
hello.apply_async(args=(0,), exchange='hell', routing_key='feed.test')
上面的代码导致Hello处理两次相同的任务。我认为这很有意义,但似乎完全忽略了我的交换和路由键设置。 (甚至还有一点要在芹菜中设置交换和路由密钥吗?)
我还尝试过直接通过amqp客户端发布:
from test1 import app
with app.producer_pool.acquire(block=True) as producer:
producer.publish(
{"id": 1},
routing_key="feed.test",
exchange="hell",
retry=True,
)
但是收到以下消息:
[2019-06-23 22:24:48,180: WARNING/MainProcess] Received and deleted unknown message. Wrong destination?!?
The full contents of the message body was: body: {'id': 1} (9b)
{content_type:'application/json' content_encoding:'utf-8'
delivery_info:{'consumer_tag': 'None5', 'delivery_tag': 1, 'redelivered': False, 'exchange': 'hell', 'routing_key': 'feed.test'} headers={}}
我如何一次将消息发布到扇出交易所,并且必须由diff任务处理而无需第三队列?
此外,不确定我是否真的了解tasks_routes
。是在接收任务时还是在发布任务时路由任务?