Celery/Redis 任务过期

问题描述 投票:0回答:1

我正在使用 Celery 并由主管运行工作程序,Redis 作为代理,我遇到了一个问题,Celery 工作程序明显冻结,使其无法处理更多任务,并导致 Redis 中的任务队列填满导致一些内存问题的点。我尝试在调用任务时设置

expires
选项,认为这会利用 Redis 对密钥过期的支持:

some_task.apply_async(args=('foo',), expires=60)

但这不起作用,当我检查 Redis CLI 中的相应列表时,它只是不断扩展 - 也许并不奇怪,因为听起来“列表过期不是 Redis 中的内置功能”。 Celery 文档 说过期时间对应于“发布”任务后的时间,但我找不到任何关于“发布”实际含义的提及。我假设它是指将任务添加到 Redis 列表中,所以要么这个假设是错误的,要么是发生了其他我不明白的事情(或两者兼而有之)。 我对任务到期时间的理解有误吗?如果是这样,有什么办法可以让消息在 Redis 内过期吗?

python redis celery celeryd
1个回答
17
投票
ttl sexykey

,如果 Celery 在此处写入密钥时将其设置为过期,您应该已经看到了剩余的秒数,从而回答了您对此事的特定不确定性。

首先,让我们明确有一个

message broker

。其次,有一个

result backend
。芹菜只有很少的
message brokers
,但有很多
result backends
。经纪商列表位于
此处
。支持的后端列表位于第 10 页(截至 2018 年 3 月 24 日),位于传输和后端部分此处。我认为它会填满的是result backend,因为这也是我所看到的。
Celery 可以使用相同的 Redis 实例作为 

message broker

result backend
。 Celery 将执行任务的结果存储为 Redis 键,无论任务是否成功,并且该 Redis 键的默认过期时间为 1 天(86400 秒)。因此,如果 Celery 执行了许多函数调用,那么您的 Redis 内存缓存将会被填满,因为 86400 秒的密钥过期时间将赶不上传入的任务结果记录。
要将密钥过期时间缩短到 60 秒,以下是 python 代码片段:

app = Celery('justdoit', broker='redis://172.17.0.2', backend='redis://172.17.0.2') app.conf.result_expires = 60

PS:

几个小时前我刚刚学习 Celery,我立即意识到(在它发生之前)与所描述的 Redis 填充场景完全相同。我使用Redis已经一年了,所以我知道它的一些特性。

© www.soinside.com 2019 - 2024. All rights reserved.