芹菜工人从systemd运行的celerybeat中接收未重做的任务

时间:2019-06-17 16:56:40

标签: rabbitmq celery systemd django-celery celerybeat

在我的登台服务器上,我启动了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的状态,即使我不知道那里出了什么问题。

编辑 在我的朋友的指导下,我错误地发现,芹菜和芹菜服务在用户根目录下似乎都可以正常工作,这显然不是解决方案,但可以缩小可能出现的缺陷的数量

1 个答案:

答案 0 :(得分:0)

即使答案来自我,也不要回答这个问题,这很不礼貌,

如果有人遇到过此类问题,请按照我上面指示的步骤进行操作,然后尝试检查celery和celerybeat使用的目录的权限-您可能已经以root权限创建了它们,最终可能会遇到上述问题。祝大家今后好运!