簡體   English   中英

Celery/Redis 任務過期

[英]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 brokerresult 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM