[英]Celery/Redis task expiration
我正在使用 Celery,主管運行工人,Redis 作為代理,我遇到了一個 Celery 工人明顯凍結的問題,使其無法處理更多任務並導致其在 Redis 中的任務隊列填滿導致一些內存問題的點。 我在調用任務時嘗試設置expires
選項,認為這將利用 Redis 對密鑰過期的支持:
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
。 Celery 只有很少的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 一年了,所以我知道它的一些特性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.