Rabbitmq 用芹菜从兔子身上食用
我在服务器A上使用芹菜和Rabbitmq代理。有些任务需要与另一台服务器交互,例如服务器B,我使用Rabbitmq队列进行此交互Rabbitmq 用芹菜从兔子身上食用,rabbitmq,celery,Rabbitmq,Celery,我在服务器A上使用芹菜和Rabbitmq代理。有些任务需要与另一台服务器交互,例如服务器B,我使用Rabbitmq队列进行此交互 队列1-服务器A(生产者),服务器B(消费者) 队列2-服务器B(生产者),服务器A(消费者) 我的芹菜出人意料地挂了起来,我发现原因是服务器A消费代码的实现不正确 channel.start\u consuming()保持按预期轮询Rabbitmq,但将其放入芹菜任务会创建多个不会过期的轮询器。我可以添加到期时间,但无法保证将数据发送到服务器B的时间完成。下面粘贴的
队列1
-服务器A(生产者),服务器B(消费者)
队列2
-服务器B(生产者),服务器A(消费者)
我的芹菜出人意料地挂了起来,我发现原因是服务器A消费代码的实现不正确
channel.start\u consuming()
保持按预期轮询Rabbitmq,但将其放入芹菜任务会创建多个不会过期的轮询器。我可以添加到期时间,但无法保证将数据
发送到服务器B的时间完成。下面粘贴的代码是我用来解决这个问题的一种方法,但我不相信这是最好的解决方案
我想知道我做错了什么,什么是实现这一点的正确方法,因为我在网上搜索文章失败了。任何提示、见解甚至文章链接都会非常有用
最后是我的代码-
@celery.task
def task_a(data):
do_some_processing
# Create only 1 Rabbitmq consumer instance to avoid celery hangups
task_d.delay()
@celery.task
def task_b(data):
do_some_processing
if data is not None:
task_c.delay()
@celery.task
def task_c():
data = some_data
data = json.dumps(data)
conn_params = pika.ConnectionParameters(host=RABBITMQ_HOST)
connection = pika.BlockingConnection(conn_params)
channel = connection.channel()
channel.queue_declare(queue=QUEUE_1)
channel.basic_publish(exchange='',
routing_key=QUEUE_1,
body=data)
channel.close()
@celery.task
def task_d():
def queue_helper(ch, method, properties, body):
'''
Callback from queue.
'''
data = json.loads(body)
task_b.delay(data)
conn_params = pika.ConnectionParameters(host=RABBITMQ_HOST)
connection = pika.BlockingConnection(conn_params)
channel = connection.channel()
channel.queue_declare(queue=QUEUE_2)
channel.basic_consume(queue_helper,
queue=QUEUE_2,
no_ack=True)
channel.start_consuming()
channel.close()