Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rabbitmq 用芹菜从兔子身上食用_Rabbitmq_Celery - Fatal编程技术网

Rabbitmq 用芹菜从兔子身上食用

Rabbitmq 用芹菜从兔子身上食用,rabbitmq,celery,Rabbitmq,Celery,我在服务器A上使用芹菜和Rabbitmq代理。有些任务需要与另一台服务器交互,例如服务器B,我使用Rabbitmq队列进行此交互 队列1-服务器A(生产者),服务器B(消费者) 队列2-服务器B(生产者),服务器A(消费者) 我的芹菜出人意料地挂了起来,我发现原因是服务器A消费代码的实现不正确 channel.start\u consuming()保持按预期轮询Rabbitmq,但将其放入芹菜任务会创建多个不会过期的轮询器。我可以添加到期时间,但无法保证将数据发送到服务器B的时间完成。下面粘贴的

我在服务器A上使用芹菜和Rabbitmq代理。有些任务需要与另一台服务器交互,例如服务器B,我使用Rabbitmq队列进行此交互

队列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()