Celery/Redis 任务到期

orn*_*688 3 python redis celery celeryd

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

some_task.apply_async(args=('foo',), expires=60)
Run Code Online (Sandbox Code Playgroud)

但这不起作用,当我在 Redis CLI 中检查相应的列表时,它一直在扩展 - 也许并不奇怪,因为听起来列表过期不是Redis 中的内置功能。将芹菜文档说,到期时间对应的时间后,“出版”的任务,但我找不到什么“出版”,其实就是任何提及。我假设它指的是将任务添加到 Redis 列表中,所以要么这个假设是错误的,要么发生了我不理解的其他事情(或两者兼而有之)。

任务到期时间我错了吗?如果是这样,有没有办法使消息在 Redis 中过期?

typ*_*gic 6

上下文比问题更令人费解。您可以使用 redis-cli 并检查了 redis 键。在 redis-cli 中,您可以输入ttl sexykey并且您应该已经看到剩余的秒数,如果密钥在 Celery 写入时设置为过期,则可以回答您关于此事的特定不确定性。

首先,让我们清楚有一个message broker. 其次,有一个result backend。芹菜只有很少message brokers但很多result backends。券商的名单是在这里支持后端的.The名单在第10页(如2018-MAR-24)下运输和后端部分在这里。它是result backend我认为会填满的,因为这也是我所看到的。

Celery 可以使用相同的 Redis 实例作为 amessage broker和 a 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
Run Code Online (Sandbox Code Playgroud)

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