如何在Cloud Foundry上与Celery进行通信?

时间:2012-06-18 18:04:29

标签: python debugging celery cloudfoundry

我有一个带有芹菜组件的wsgi应用程序。基本上,当某些请求进入时,他们可以将相对耗时的任务交给芹菜。我在自己设置的服务器上有该产品的工作版本,但我们的客户最近要求我将其部署到Cloud Foundry。由于Celery不能作为Cloud Foundry上的服务提供,我们(我和客户的部署团队)决定部署应用程序两次 - 一次作为wsgi应用程序,一次作为独立的芹菜应用程序,共享一个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==

我如何调试这个和/或为什么我的任务消失了?

1 个答案:

答案 0 :(得分:1)

显然问题是由经纪人和芹菜工人之间的僵局造成的,这样工人永远不会承认任务完成,也从不接受新任务,但也从未崩溃或失败。任务没有消失;他们只是永远呆在队列中。

更新:死锁是由于我们在安装依赖项的包装器脚本中运行celeryd这一事实。 (字面意思pip install -r requirements.txt && ./celeryd -lINFO)。由于Cloud Foundry如何管理进程树,Cloud Foundry会尝试杀死HUP芹菜的父进程(bash),但最终很多子进程永远不会死。