Sco*_*tes 5 python redis celery
我最近开始在一个新的Django项目中使用芹菜.设置:
-------------- 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
Run Code Online (Sandbox Code Playgroud)
我正在调查一个问题,即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
Run Code Online (Sandbox Code Playgroud)
我见过其他人报告说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不存在.
因此看起来任务不会消失,但要么根本没有发送,要么没有被放入unackedredis密钥.
WorkerLostError 是不正常的,你绝对应该担心。
至于长时间运行的作业的确认/重新启动:Celery 尽力而为,但是如果您偏执并且您期望有保证的交付/执行/确认模型,即使父/工作人员在异常情况下死亡,您可能会考虑使用用于跟踪进度和元数据的辅助数据存储,以便您进行细粒度控制:
Client->TransactionalDB: insert JOB
Client->Celery: send_async(job_id)
Celery->Worker: do(job_id)
Worker->TransactionalDB: update started job + meta
...
Worker->TransactionalDB: update progress + meta
...
?->Worker: die!
...
Celerybeat->Worker: checkForOrphans()
Worker->TransactionalDB: select where ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5373 次 |
| 最近记录: |