使用 RabbitMQ 的 Amazon Elastic Beanstalk 上的 Celery 超时异常

dav*_*ode 4 django rabbitmq amazon-web-services celery amazon-elastic-beanstalk

我正在尝试在我的 Beanstalk 环境中使用 Celery(这是完成我项目的技术堆栈的最后一部分:P)。这是我到目前为止所做的:

  • 由于 RabbitMQ 是 Celery 的最佳代理,而 Amazon 不提供专用服务,因此我创建了一个基于 Ubuntu 13 64 位的自定义 AMI
  • 安装RabbitMQ
  • 删除了默认用户来宾/来宾
  • 创建了一个自定义用户
  • 创建了一个自定义虚拟主机
  • 安装的管理插件
  • 使用 http API 测试了我的配置,以确认我的 RabbitMQ 服务器已启动并正在运行。

到现在为止还挺好!然后在我的 beanstalk .config文件中,我为 celery 添加了几个命令:

04_celery_periodic_tasks:
    command: "celery worker --app=com.cygora --loglevel=info --beat --autoreload -n period_tasks_worker.%h"
    leader_only: true
05_celery_standard_worker:
    command: "celery worker --app=com.cygora --loglevel=info --autoreload -n worker_1.%h"
Run Code Online (Sandbox Code Playgroud)

一旦我部署了我的应用程序,我就没有发现任何与 celery 相关的错误(所以我假设这一切都很好,从“Python/Django 方面”)......但是一旦我使用我网站的一个功能需要通过 Celery 向 Rabbit 发送消息,我收到超时异常:

[Thu Feb 20 22:01:24 2014] [error]    File "/opt/python/run/venv/lib/python2.7/site-packages/kombu/transport/pyamqp.py", line 111, in establish_connection
[Thu Feb 20 22:01:24 2014] [error]      conn = self.Connection(**opts)
[Thu Feb 20 22:01:24 2014] [error]    File "/opt/python/run/venv/lib/python2.7/site-packages/amqp/connection.py", line 165, in __init__
[Thu Feb 20 22:01:24 2014] [error]    self.transport = create_transport(host, connect_timeout, ssl)
[Thu Feb 20 22:01:24 2014] [error]   File "/opt/python/run/venv/lib/python2.7/site-packages/amqp/transport.py", line 274, in create_transport
[Thu Feb 20 22:01:24 2014] [error]   return TCPTransport(host, connect_timeout)
[Thu Feb 20 22:01:24 2014] [error]  File "/opt/python/run/venv/lib/python2.7/site-packages/amqp/transport.py", line 89, in __init__
[Thu Feb 20 22:01:24 2014] [error]  raise socket.error(last_err)
[Thu Feb 20 22:01:24 2014] [error]  error: timed out
Run Code Online (Sandbox Code Playgroud)

我在设置中将代理 url 指定为:

BROKER_URL = "amqp://myuser:mypassword@myelasticip:5672/myvirtualhost"
Run Code Online (Sandbox Code Playgroud)

我错过了什么或我做错了什么?为什么无法建立socket连接?

dav*_*ode 5

我忘了我问过这个问题……无论如何我解决了。这只是为 RabbitMQ 打开正确的 TCP 端口的问题:

22

15672

5672

我还改变了运行 celery 的方式,通过使用 supervisor + django-supervisor 来正确地守护它:)