关于python:Celery / Redis任务到期

Celery/Redis task expiration

我使用的是芹菜,主管运行工人,而Redis作为经纪人,我遇到了一个问题,芹菜工人显然冻结了,使其无法处理更多任务,并导致Redis中的任务队列填满了导致一些内存问题的观点。我在调用任务时尝试设置expires选项,认为这将利用Redis对密钥有效期的支持:

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

但这是行不通的,当我在Redis CLI中检查相应列表时,它一直在扩展-也许并不奇怪,因为听起来好像列表过期不是Redis的内置功能。 Celery文档说过期时间与"发布"任务后的时间相对应,但是我找不到"发布"的实际含义。我以为它是指将任务添加到Redis列表中,因此,要么推定是错误的,要么是发生了我不理解的其他事情(或两者都发生了)。

任务到期时间我错了吗?如果是这样,是否有任何方法可以使消息在Redis中过期?


上下文比问题更令人困惑。您可以使用redis-cli并检查了redis密钥。在redis-cli中,您可以键入ttl sexykey,并且如果密钥被Celery写入时设置为过期,那么您应该已经看到了剩余的秒数,因此您应该对此事做出特别的不确定性回答。

首先,让我们清楚地有一个message broker。其次,有一个result backend。芹菜只有很少的message brokers,但是很多result backends。经纪人列表位于此处。受支持的后端列表位于此处的``传输和后端''部分下的第10页(截至2018年3月24日)。我以为result backend会被填满,因为这也是我所看到的。

Celery可以将同一Redis实例用作message brokerresult backend。 Celery将已执行任务的结果存储为Redis密钥,而与任务是否成功无关,并且此Redis密钥的默认有效期为1天(86400秒)。因此,如果您有许多由Celery执行的函数调用,则Redis内存缓存将被填满,因为86400秒的密钥到期将不会跟上任务记录的传入记录。

为了将密钥有效期缩短到60秒,这是python代码段:

1
2
3
4
5
app = Celery('justdoit',
    broker='redis://172.17.0.2',
    backend='redis://172.17.0.2')

app.conf.result_expires = 60

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