我正在使用 Celery 并由主管运行工作程序,Redis 作为代理,我遇到了一个问题,Celery 工作程序明显冻结,使其无法处理更多任务,并导致 Redis 中的任务队列填满导致一些内存问题的点。我尝试在调用任务时设置
expires
选项,认为这会利用 Redis 对密钥过期的支持:
some_task.apply_async(args=('foo',), expires=60)
但这不起作用,当我检查 Redis CLI 中的相应列表时,它只是不断扩展 - 也许并不奇怪,因为听起来“列表过期不是 Redis 中的内置功能”。 Celery 文档 说过期时间对应于“发布”任务后的时间,但我找不到任何关于“发布”实际含义的提及。我假设它是指将任务添加到 Redis 列表中,所以要么这个假设是错误的,要么是发生了其他我不明白的事情(或两者兼而有之)。 我对任务到期时间的理解有误吗?如果是这样,有什么办法可以让消息在 Redis 内过期吗?
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
几个小时前我刚刚学习 Celery,我立即意识到(在它发生之前)与所描述的 Redis 填充场景完全相同。我使用Redis已经一年了,所以我知道它的一些特性。