我最近在一个新的Django项目中开始使用celery。设置:
-------------- celery@123 v3.1.7 (Cipater)
---- **** -----
--- * *** * -- Linux-3.8.11-ec2-x86_64-with-debian-squeeze-sid
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app: nextlanding_api:0x1c23250
- ** ---------- .> transport: redis://rediscloud@123123
- ** ---------- .> results: djcelery.backends.database:DatabaseBackend
- *** --- * --- .> concurrency: 4 (prefork)
-- ******* ----
--- ***** ----- [queues]
-------------- .> celery exchange=celery(direct) key=celery
software -> celery:3.1.7 (Cipater) kombu:3.0.8 py:2.7.4
billiard:3.3.0.13 redis:2.9.0
platform -> system:Linux arch:64bit, ELF imp:CPython
loader -> celery.loaders.app.AppLoader
settings -> transport:redis results:djcelery.backends.database:DatabaseBackend
我正在调查一个问题,即eta为24小时以上的任务会“消失”(我已确保visibility_timeout大于24小时)。当我温柔地关闭工作者时,日志记录显示有几条消息被确认。例如:
Restoring 26 unacknowledged message(s).
然而,我预期应该恢复大约50个未确认的消息左右。仔细查看我的日志,我发现:[ERROR] celery.worker.job: Task myproj_task[xxx] raised unexpected: WorkerLostError('Worker exited prematurely: signal 15 (SIGTERM).',)
...
WorkerLostError: Worker exited prematurely: signal 15 (SIGTERM).
Restoring 26 unacknowledged message(s).
Process exited with status 0
我看到其他人报告说OOM杀死了他们的进程。 我在Heroku上,并没有看到R14代码。
最后一个背景信息是,我正在我的任务中从中生成新的进程。
我的问题是:WorkerLostError是我应该担心的东西吗?状态码为15(SIGTERM),这似乎是可以的。 如果此错误不正常,则是否可能导致丢失ETA任务?
编辑
起初,我以为项目正在消失,但在放置一些冗长的日志之后,我可以看到任务已经被发出,但从未在redis中持久化。
myproj_email_task已发送。 任务ID:b6ce2b97-d5b8-4850-9e43-9185426cd9f6
然而,在查看redis中的任务时,任务
b6ce2b97-d5b8-4850-9e43-9185426cd9f6
不存在。因此,似乎任务并没有消失,而是根本没有被发送或被放入
unacked
的redis键中。