2012-10-23 97 views
1

我试图使用Celery与RabbitMQ后端在Fedora上运行异步后台任务,我发现它令人沮丧地不可靠。最大的问题是它偶尔会多次运行相同的任务,并且在诊断原因时遇到问题。Celeryd运行多个守护进程

我不认为我的代码多次触发任务,因为我通过手动启动任务(创建数据库记录)来测试一次,并且看到创建了两个相同的记录。如果我从Django shell运行代码,只创建一条记录,所以问题肯定是Celery。

我有3个服务器,每个运行celeryd,只有第一个运行rabbitmq,并且所有3个服务器共享相同的数据库。我的第一个通过是,我的芹菜设置有问题,导致每台服务器上的芹菜检索并执行相同的任务。然而,芹菜文档中没有任何东西似乎区分单个主机和多主机设置,因此假设我已经在每个服务器的settings.py中指定了正确的BROKER_HOST/PORT/USER/PASSWORD/VHOST,它应该“只是工作“与多个主机。它是否正确?

另一个想法是我可能以某种方式运行芹菜的多个实例,虽然我不知道如何检查这个。两个服务器都运行Fedora 13,当我运行ps aux | grep .*.py我得到:

root  24806 0.1 1.8 51404 31328 ?  Sl Oct19 9:25 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler 
root  24900 0.1 1.6 51404 28592 ?  S Oct19 6:02 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler 
root  24901 0.3 9.4 183232 161948 ?  S Oct19 22:32 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler 

这是否意味着3个独立的celeryd的实例在运行?如果是这样,这是一个错误,我应该杀死其中的2个?

我的第三台服务器运行Fedora 17,它有不同的服务框架。当我运行systemctl status celeryd.service我得到:

celeryd.service - LSB: celery task worker daemon 
     Loaded: loaded (/etc/rc.d/init.d/celeryd) 
     Active: active (exited) since Fri, 19 Oct 2012 10:59:38 -0400; 4 days ago 
    Process: 732 ExecStop=/etc/rc.d/init.d/celeryd stop (code=exited, status=0/SUCCESS) 
    Process: 738 ExecStart=/etc/rc.d/init.d/celeryd start (code=exited, status=0/SUCCESS) 
     CGroup: name=systemd:/system/celeryd.service 

我不知道如何解释这一点。 “活跃”通常在运行,但“退出”通常意味着它没有运行。当我运行ps aux | grep .*celery.*我只得到:

root  25142 0.0 0.0 109400 932 pts/0 S+ 11:28 0:00 grep --color=auto .*celery.* 

那么,这是否意味着celeryd没有运行,或者我应该寻找别的东西吗?

编辑:基于this的答案,我认为这3个过程可能是默认的。

+0

行的我是复制表明您运行的多个实例celerybeat。这是真的?根24901 0.3 9.4 183232 161948? S Oct19 22:32 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B - -scheduler djcelery.schedulers.DatabaseScheduler –

回答

2

我张贴的评论,但我相信这是你的问题,在这里看到:

root  24806 0.1 1.8 51404 31328 ?  Sl Oct19 9:25 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler 
root  24900 0.1 1.6 51404 28592 ?  S Oct19 6:02 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler 
root  24901 0.3 9.4 183232 161948 ?  S Oct19 22:32 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler 

跑步celeryd与拍三次。所以,你的发送节拍消息三次。

您应该只有一个实例与节拍上,或者在自己的(最好)运行celerybeat并采取-B关闭celeryd实例

+0

我刚刚发现了一些确认你关于celerybeat的观点的文档。 http://ask.github.com/celery/getting-started/periodic-tasks.html – Cerin