在我的登台服务器上,我启动了celery worker(4.3.0),并通过以RabbitMQ作为代理的systemd将celery beat作为守护程序运行。直到4天前的那一刻,一切都好了几周,当时芹菜和amqp之间通过kombu发生了某种连接错误。 [Errno 104] Connection reset by peer after started
由于该项目处于WiP阶段,因此我并没有对服务器日志给予太多关注,但是当我尝试部署最新版本的代码时,我意识到工作人员有问题。
我用谷歌搜索了这个问题,然后弹出: https://github.com/celery/celery/issues/4867
简单的解决方案是将celery降级到4.1.1,然后等待修复将来的稳定版本。
我从venv中删除了芹菜,amqp,台球和海带,安装了celery.4.1.1,并以适当的版本安装了上述软件包。
celery和celerybeat的atm服务处于活动状态,celerybeat将任务发送给celery worker,但是celery日志显示我错误消息(降级后请查看celery的错误代码)。太奇怪了,因为我没有更改任务声明或设置中的任何内容(这可能是这里的问题)。
最奇怪的是,如果我关闭systemd服务并以以下命令运行它们:
celery -A celery_cfg:app worker -B --loglevel=DEBUG
所有当前任务都将像过去一样进行。因此,celery和celerybeat配置似乎正在工作。
我尝试过的几种尖锐方法:
1)确保导入所有模块而不导入亲戚。
2)过去遇到的问题是venv中缺少软件包->它们是最新的
3)重新启动celery / celerybeat / gunicorn / systemd / rabbitmq和服务器本身
4)仔细检查了systemd服务中的路径(但是也许我调试的时间很长,但看不到错字或其他内容)
5)尝试使用开发版本4.4.0rc2
,(芹菜工作者将无法站起来)
6)已安装的应用包含所有必需的应用
芹菜版本降级后出现错误消息
`2019-06-16 19:35:00,092: ERROR/MainProcess] Received unregistered task of type 'apps.mailing.tasks.execute_sending_system_mail'.
The message has been ignored and discarded.
Did you remember to import the module containing this task?
Or maybe you're using relative imports?
Please see
http://docs.celeryq.org/en/latest/internals/protocol.html
for more information.
The full contents of the message body was:
'[[], {}, {"callbacks": null, "errbacks": null, "chain": null, "chord": null}]' (77b)
Traceback (most recent call last):
File "/home/user/apps/venv/loans/lib/python3.7/site-packages/celery/worker/consumer/consumer.py", line 557, in on_task_received
strategy = strategies[type_]
KeyError: 'apps.mailing.tasks.execute_sending_system_mail'
芹菜服务系统代码
Description=Celery Service
After=network.target
[Service]
Type=forking
User=<user>
Group=<user>
EnvironmentFile=/etc/default/celery
WorkingDirectory=/home/<user>/apps/loans
ExecStart=/bin/sh -c '${CELERY_BIN} multi start ${CELERYD_NODES} \
-A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \
--logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}'
ExecStop=/bin/sh -c '${CELERY_BIN} multi stopwait ${CELERYD_NODES} \
--pidfile=${CELERYD_PID_FILE}'
ExecReload=/bin/sh -c '${CELERY_BIN} multi restart ${CELERYD_NODES} \
-A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \
芹菜节拍服务系统代码
Description=Celery Beat Service
After=network.target
[Service]
Type=simple
User=user
Group=user
EnvironmentFile=/etc/default/celery
WorkingDirectory=/home/user/apps/loans
ExecStart=/bin/sh -c '${CELERY_BIN} beat \
-A ${CELERY_APP} --pidfile=${CELERYBEAT_PID_FILE} \
--logfile=${CELERYBEAT_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL}'
[Install]
WantedBy=multi-user.target
Conf文件中的变量
CELERYD_NODES="w1"
CELERY_BIN="/home/user/apps/venv/loans/bin/celery"
CELERY_APP="celery_cfg:app"
CELERYD_MULTI="multi"
CELERYD_OPTS=""
CELERYD_PID_FILE="/home/user/apps/pids/celery/%n.pid"
CELERYD_LOG_FILE="/home/user/apps/logs/celery/%n%I.log"
CELERYD_LOG_LEVEL="INFO"
CELERYBEAT_PID_FILE="/home/user/apps/pids/celery/beat.pid"
CELERYBEAT_LOG_FILE="/home/user/apps/logs/celery/beat.log"
celery_cfg文件
app = Celery('loans_apps')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
app.set_default()
# <====CELERY BEAT PERIODIC TASKS ====>
app.conf.beat_schedule = {
'execute_sending_system_mail': {
'task': 'apps.mailing.tasks.execute_sending_system_mail',
'schedule': crontab(minute='*/5'),
'args': (),
},
}
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
包含celery cfg变量的设置的次要剪切
BROKER_URL = 'amqp://localhost//',
CELERY_ENABLE_UTC = True
我知道我可以在没有systemd的情况下尝试设置celery和celerybeat,但是我将其作为最后的解决方案。我想保持conf的状态,即使我不知道那里出了什么问题。
编辑 在我的朋友的指导下,我错误地发现,芹菜和芹菜服务在用户根目录下似乎都可以正常工作,这显然不是解决方案,但可以缩小可能出现的缺陷的数量
答案 0 :(得分:0)
即使答案来自我,也不要回答这个问题,这很不礼貌,
如果有人遇到过此类问题,请按照我上面指示的步骤进行操作,然后尝试检查celery和celerybeat使用的目录的权限-您可能已经以root权限创建了它们,最终可能会遇到上述问题。祝大家今后好运!