1

我正在尝试设置 rabbitmq/celery/django-celery/django 以使其具有“防重启”功能,即一切都会自行恢复。一切似乎都很好,除了这个:

当我重新启动时,所有服务都启动了,但似乎 celeryd 在 rabbitmq 之前启动,并且 celerybeat 随后被终止,因为它无法连接(?):

[2011-06-14 00:48:35,128: WARNING/MainProcess] celery@inquire has started.
[2011-06-14 00:48:35,130: INFO/Beat] child process calling self.run()
[2011-06-14 00:48:35,131: INFO/Beat] Celerybeat: Starting...
[2011-06-14 00:48:35,134: ERROR/MainProcess] Consumer: Connection Error: [Errno 111] Connection refused. Trying again in 2 seconds...
[2011-06-14 00:48:35,688: INFO/Beat] process shutting down
[2011-06-14 00:48:35,689: WARNING/Beat] Process Beat:
[2011-06-14 00:48:35,689: WARNING/Beat] Traceback (most recent call last):
...
[2011-06-14 00:48:35,756: WARNING/Beat] File "/home/inquire/inquire.env/lib/python2.6/site-packages/amqplib/client_0_8/transport.py", line 220, in create_transport
[2011-06-14 00:48:35,760: WARNING/Beat] return TCPTransport(host, connect_timeout)
[2011-06-14 00:48:35,761: WARNING/Beat] File "/home/inquire/inquire.env/lib/python2.6/site-packages/amqplib/client_0_8/transport.py", line 58, in __init__
[2011-06-14 00:48:35,761: WARNING/Beat] self.sock.connect((host, port))
[2011-06-14 00:48:35,761: WARNING/Beat] File "<string>", line 1, in connect
[2011-06-14 00:48:35,761: WARNING/Beat] error: [Errno 111] Connection refused
[2011-06-14 00:48:35,761: INFO/Beat] process exiting with exitcode 1
[2011-06-14 00:48:37,137: ERROR/MainProcess] Consumer: Connection Error: [Errno 111] Connection refused. Trying again in 4 seconds...

在 Ubuntu 上,我将带有 apt 的 rabbitmq-server、带有 pip 的 django-celery 安装到我的 virtualenv 中,然后我符号链接了我从https://github.com/ask/celery/tree/master/contrib/debian获得的“celeryd”initscript /etc/init.d 中的/init.d,在 /etc/default/celeryd 中将其配置为使用我的 virtualenv 中的 django celeryd,并通过它使其“防重启”(也许“默认值”是问题?)

update-rc.d celeryd defaults

我没有使用单独的 initscript 运行 celeryd 和 celerybeat,而是将 celeryd 配置为包含 Beat(也许这就是问题所在?):

CELERYD_OPTS="-v 2 -B -s celery -E"

任何指针如何解决这个问题?

如果我

sudo /etc/init.d/celeryd restart

没有投诉:

[2011-06-14 00:54:29,157: WARNING/MainProcess] celery@inquire has started.
[2011-06-14 00:54:29,161: INFO/Beat] child process calling self.run()
[2011-06-14 00:54:29,162: INFO/Beat] Celerybeat: Starting...

但我需要消除对任何手动步骤的需要。

4

2 回答 2

1

celerybeat 对代理服务的依赖确实是问题所在。而不是安装 initscript

update-rc.d celeryd defaults

将 rabbitmq-server 脚本安装为用于启动和终止的序列号 20,必须通过在 rabbitmq-server 之后显式启动它(并在之前终止它)来解决 celerybeat 的依赖关系,方法是使用

update-rc.d celeryd defaults 21 19

注意:我实际上选择了单独的 celerybeat 服务而不是 -B 调用,并且只为那个脚本做了 21 19 ,即有问题的那个。

于 2011-06-15T09:17:59.817 回答
0

我认为问题不在于 celery 它本身,而在于您的脚本,可能当 celeryd 启动时,经纪人还没有在听。我正在使用几乎相同的命令并且我没有任何问题,使用 -B 选项启动 celeryd 脚本没有错。我认为在你的重启脚本上你必须等待 rabbitmq 在启动 celeryd 之前完成重启,也许也需要测试连接。

于 2011-06-14T07:26:18.737 回答