Celery-RabbitMQ分布式队列测试消息

时间:2014-04-29 21:03:48

标签: python rabbitmq celery message-queue

我在终端上运行ERROR/MainProcess] consumer: Cannot connect to amqp://ec2celeryuser时不断获得:celery -A tasks worker

基本上我要做的就是让celery / rabbitmq在(2)ec2实例中正常工作。将tasks.py中的愚蠢任务传递给rabbitmq。

  1. Instance 1 - Houses rabbitMQ
  2. 目前运行RabbitMQ很好。如果我运行sudo rabbitmqctl status,则输出:

    Status of node 'rabbit@ip-xx-xxx-xxx-xx' ...
    [{pid,786},
    

    2。实例2 - 芹菜屋

    我尝试使用终端中的以下内容在instance 2上针对实例1运行芹菜:

    芹菜 - 任务工作者

    我有一个文件celeryconfig.py

    BROKER_URL = 'amqp://ec2celeryuser:mypasshere@xx.xxx.xx.xx:5672/celeryserver1/'
    
    #CELERY SETTINGS
    CELERY_IMPORTS = ("tasks",)
    
    CELERY_RESULT_BACKEND = "amqp"
    

    我有一个文件client.py

    from tasks import add
    
    result = add.delay(4, 4) # call task
    result_sum = result.get(timeout=5) # wait to get result for a maximum of 5 seconds
    

    我有一个文件tasks.py

    from celery import Celery
    
    app = Celery('tasks', broker='amqp://ec2celeryuser:mypasshere@xx.xxx.xx.xx:5672/celeryserver1/')
    
    @app.task
    def add(x, y):
        return x + y
    

    我已正确设置vhost,用户ec2celeryuser,并授予此用户以下权限:

    sudo rabbitmqctl set_permissions -p /celeryserver1 ec2celeryuser ".*" ".*" ".*"
    

    如果我在RabbitMQ上执行:sudo rabbitmqctl list_users(实例1),则显示:

    ec2celeryuser   []
    guest   [administrator
    

    我已经尝试了两个用户名和密码,但没有变化。

    我一直关注Celery Guide,而tutorial没有太多运气。

    我在这里做错了什么?显然存在连接问题,但我做错了什么?

    谢谢!

2 个答案:

答案 0 :(得分:3)

感谢用户natdempk帮助我修复队列的配置语法。

问题是在rabbitmq中创建vhost,如:

sudo rabbitmqctl add_vhost /celeryserver1

应该是什么时候:

sudo rabbitmqctl add_vhost celeryserver1

然后,我必须重置用户ec2celeryuser的权限,如:

sudo rabbitmqctl set_permissions -p celeryserver1 ec2celeryuser ".*" ".*" ".*"

我意识到这一点的方式是:我访问了/var/log/rabbitmq/<last log file.log>

并且看到了:

=INFO REPORT==== 30-Apr-2014::12:45:58 ===
accepted TCP connection on [::]:5672 from xx.xxx.xxx.xxx:45964

=INFO REPORT==== 30-Apr-2014::12:45:58 ===
starting TCP connection <x.xxx.x> from from xx.xxx.xxx.xxx:45964

=ERROR REPORT==== 30-Apr-2014::12:46:01 ===
exception on TCP connection <x.xxx.x> from from xx.xxx.xxx.xxx:45964
{channel0_error,opening,
                {amqp_error,access_refused,
                            "access to vhost 'celeryserver1/' refused for user 'ec2celeryuser'",
                            'connection.open'}}

自从修复虚拟主机以来,我现在很高兴看到:

[2014-04-30 13:08:10,101: WARNING/MainProcess] celery@ip-xx-xxx-xx-xxx ready.

答案 1 :(得分:1)

所以我在这里看到了一些错误。首先,tasks.py中RabbitMQ的代理网址似乎不正确。它应该如下所示。

app = Celery('tasks', broker='amqp://ec2celeryuser:ec2celerypassword@xx.xxx.xx.xx/celeryserver1/')

此外,您可能希望在运行工作进程时指定希望芹菜提供的应用程序。您可以通过从celery -A tasks worker目录中运行tasks.py来执行此操作。

另一件事是client.py中的代码调用您的任务似乎不正确。从芹菜文档中,您可以按如下方式调用该任务:

from tasks import add

result = add.delay(4, 4) # call task
result_sum = result.get(timeout=5) # wait to get result for a maximum of 5 seconds

修复这些问题可能会解决您的问题,或者至少可以让您更接近。