我有一个带有芹菜组件的wsgi应用程序。基本上,当某些请求进来时,他们可以将相对耗时的任务交给芹菜。我在自己设置的服务器上有一个该产品的工作版本,但我们的客户最近要求我将其部署到Cloud Foundry。由于 Celery 在 Cloud Foundry 上不能作为服务使用,我们(我和客户的部署团队)决定部署该应用程序两次 - 一次作为 wsgi 应用程序,一次作为独立的 celery 应用程序,共享 rabbitmq 服务。
应用程序之间的代码是相同的。wsgi 应用正确响应,返回预期的网页。 vmc logs celeryapp
表明芹菜是要启动并运行的,但是当我向 wsgi 发送应该成为芹菜任务的请求时,一旦它们进入.delay()
语句,它们就会消失。它们既不出现在芹菜日志中,也不显示为错误。
尝试调试:
- 我不能在Cloud Foundry中使用
celery.contrib.rdb
(为pdb提供telnet接口),因为每个应用程序都是沙盒和端口限制的。 - 我不知道如何找到这些应用程序应该共享的特定 rabbitmq 实例,所以我可以看到它正在传递哪些消息。
更新:为了证实上述关于查找 rabbitmq 的说法,以下是当我尝试访问应该共享芹菜任务的节点时发生的情况:
root@cf:~# export RABBITMQ_NODENAME=eecef185-e1ae-4e08-91af-47f590304ecc
root@cf:~# export RABBITMQ_NODE_PORT=57390
root@cf:~# ~/cloudfoundry/.deployments/devbox/deploy/rabbitmq/sbin/rabbitmqctl list_queues
Listing queues ...
=ERROR REPORT==== 18-Jun-2012::11:31:35 ===
Error in process <0.36.0> on node 'rabbitmqctl17951@cf' with exit value: {badarg,[{erlang,list_to_existing_atom,["eecef185-e1ae-4e08-91af-47f590304ecc@localhost"]},{dist_util,recv_challenge,1},{dist_util,handshake_we_started,1}]}
Error: unable to connect to node 'eecef185-e1ae-4e08-91af-47f590304ecc@cf': nodedown
diagnostics:
- nodes and their ports on cf: [{'eecef185-e1ae-4e08-91af-47f590304ecc',57390},
{rabbitmqctl17951,36032}]
- current node: rabbitmqctl17951@cf
- current node home dir: /home/cf
- current node cookie hash: 1igde7WRgkhAea8fCwKncQ==
如何调试和/或为什么我的任务消失了?
显然,问题是由代理和芹菜工人之间的僵局引起的,因此工人永远不会承认任务已完成,也永远不会接受新任务,但也从未崩溃或失败。任务并没有消失;他们只是永远排着队。
更新:死锁是由于我们在安装了依赖项的包装脚本中运行 celeryd 引起的。(字面意思是pip install -r requirements.txt && ./celeryd -lINFO
)。由于Cloud Foundry管理进程树的方式,Cloud Foundry会尝试杀死父进程(bash),这将HUP芹菜,但最终许多子进程永远不会死亡。