1. celery(LIST) 是待領(lǐng)取隊列,任務(wù)被 worker 取走后就會從這里移除。
2. unacked(HASH)+ unacked_index(ZSET) 是已被取走但未 ACK 的任務(wù),文章說 worker 退出會自動回寫隊列,但實測只有正常退出(ctrl+c/stop)才會回寫;如果是進(jìn)程崩潰、kill -9、掛死,任務(wù)會一直留在 unacked,不會自動回到 celery 隊列,必須等 visibility_timeout 或手動執(zhí)行 celery inspect restore 才能恢復(fù)。
3. visibility_timeout 不是 Redis 自動執(zhí)行,而是由活著的 worker 定時掃描才會把超時任務(wù)放回隊列;如果全部 worker 都掛了,這個超時機(jī)制等于失效。
4. prefetch_multiplier(預(yù)?。?影響非常大:
5. 默認(rèn) prefetch_multiplier=4,worker 啟動后會一次性把隊列里的任務(wù)全部取到 unacked,隊列瞬間變空;
6. 設(shè)為 1 時,worker 一次只取 1 個,執(zhí)行完再取下一個,更安全,不會大量任務(wù)堆積在 unacked。
7. --pool=solo 與默認(rèn) prefork 區(qū)別:--pool=solo:不預(yù)取,一次只拿 1 個,unacked 最多 1 條;
默認(rèn) -c N:會批量預(yù)取,隊列容易被一次性取空,unacked 會瞬間變多。
總結(jié):想穩(wěn)定不丟任務(wù)、不卡 unacked,建議用:--prefetch-multiplier=1 + 合理 visibility_timeout,崩潰后記得手動恢復(fù)任務(wù)
Celery + Redis 的探究文本嘗試研究,使用 redis 作為 celery 的 broker 時,celery 的交互操作同 redis 中數(shù)據(jù)記錄的關(guān)聯(lián)關(guān)系。不在乎過程的,可以直接看最后的結(jié)論。 ...