【发布时间】:2014-02-03 07:17:23
【问题描述】:
我最近开始在一个新的 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 was sent. task_id: b6ce2b97-d5b8-4850-9e43-9185426cd9f6
但是,查看redis中的任务,任务b6ce2b97-d5b8-4850-9e43-9185426cd9f6并不存在。
所以看起来任务并没有消失,而是根本没有发送或没有被放入unacked redis 键中。
【问题讨论】:
-
“正常”任务也有同样的问题,不是 eta 或倒计时。工人刚刚死去,还剩下很多内存。你找到它的原因了吗?
-
我离开了 celery,但我认为这个问题与将数据库用作虚假消息队列有关。一旦我转移到 redis 或 rabbitmq,我认为这个问题会自行解决。
-
你现在只是在使用普通的 redis/rabbitmq 吗?但是你还在用 Python 吗?