真正讓 queue 難用的,通常不是 queue 本身,而是你把一段本來就不穩定的流程包進 job 之後,才第一次正視它。
我現在看 timeout 這件事,會先分成三個層次:
我先看三個層次
- 這個 job 到底是不是單一責任。
- 失敗之後重跑,系統會不會出現副作用。
- timeout 發生時,現在的錯誤訊息能不能讓人真的追到問題。
先拆 job,再談 timeout
如果一個 job 裡同時做「查資料、打第三方 API、處理圖片、更新通知狀態」,它本來就不該靠調大 timeout 解決。比較好的做法通常是把流程拆成幾個更可觀察的 job,並在邊界上保留明確的狀態欄位。
另外一個常見問題是 retry。很多人把 queue 當成可靠機制,但其實它只是把失敗延後。若你的 job 不是 idempotent,retry 會把問題放大。例如第三方扣款、發送 email、更新積分這種有副作用的行為,都必須先定義「重跑一次是否安全」。
我後來會優先做的,不是先改 timeout 秒數,而是先補這些東西:
我會先補的觀察點
- 讓 log 能看到 payload 的關鍵識別資訊
- 讓失敗狀態能回寫資料庫
- 把明顯不穩定的外部請求隔離成獨立 job
當這三件事都做完之後,timeout 調整才有意義。否則你只是把不清楚的失敗,變成更晚才發生的失敗。