我正在使用Celery与主管运行工作人员和Redis作为经纪人,我遇到了Celery工作人员显然冻结的问题,使其无法处理任何更多任务并导致其在Redis中的任务队列填充直到造成一些内存问题。我在调用任务时尝试设置expires
选项,认为这会利用Redis对密钥到期的支持:
some_task.apply_async(args=('foo',), expires=60)
但这没有用,当我在Redis CLI中检查相应的列表时,它只是不断扩展 - 也许不足为奇,因为它在Redis中听起来像list expiry is not built-in functionality。 Celery docs表示过期时间对应于“发布”任务后的时间,但我找不到任何“发布”实际意味着什么。我曾经假设它将这个任务添加到Redis列表中,所以要么推测是错误的,要么是其他正在发生的我不理解的事情(或两者兼而有之)。
我对任务到期时间错了吗?如果是这样,有没有办法让消息在Redis中过期?
答案 0 :(得分:0)
上下文比问题更令人费解。您可以使用redis-cli并检查redis键。在redis-cli中,您可以键入ttl sexykey
,如果在Celery写入密钥时密钥设置为过期,您应该看到剩余的秒数,从而回答您在此问题上的特定不确定性。
首先,让我们明确一下message broker
。其次,有一个result backend
。芹菜只有很少message brokers
但很多result backends
。经纪人列表为here。受支持的后端列表位于第10页(截至2018年3月24日)传输和后端部分{{ 3}}。我认为这是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一年,所以我知道它的一些特性。