返回首頁

GitHub Repo

Dify 社群回報 Node.js SDK 串流逾時失效,回傳串流後即清除計時器

10 月 31 日的 Dify 社群回報指出,Node.js SDK 的逾時設定可能無法涵蓋串流回應的後續讀取。作者提供隔離重現,但尚未證實正式部署受影響,串流逾時契約也仍待釐清。

The original uploader was Ggia at Greek Wikipedia. · CC BY-SA 2.5 · Image source
zh-Hant

Dify 的 Node.js SDK 出現一項涉及串流生命週期的可靠性回報。10 月 31 日公開的議題指出,dify-client 3.1.0 在回傳串流物件後,可能提前移除逾時保護;若回應標頭已抵達、本文卻停止傳送,後續讀取便可能超過設定期限而持續等待。回報針對指定原始碼版本,並非正式環境事故通報。議題與重現程式

依作者分析,requestRaw() 建立由 AbortController 驅動的計時器,卻在 finally 區塊一律清除。一般 JSON 路徑會先等待本文解碼;串流路徑則提早交回可讀串流,讓清理程序早於資料消費結束。這使相同的 timeout 設定,在兩種回應模式下具有不同的有效範圍。回報中的程式路徑說明

作者以記憶體中的 Response 取代 fetch,模擬保持開啟的本文:設定 20 毫秒逾時、停用重試後,JSON 對照組拋出 TimeoutError,SSE 與二進位讀取在 120 毫秒觀察期結束時仍未完成。這項測試隔離了計時器管理問題,沒有呼叫 Dify 伺服器或模型,因此不能推算實際網路環境的停滯時間與發生率。測試設定與限制

對工程團隊而言,需要分清請求取得回應、本文讀取完成,以及取消訊號觸發這幾個時點。Node.js 官方文件說明,AbortController 用於發出取消訊號,AbortSignal.timeout() 則可在指定時間後觸發訊號;應用仍須讓實際讀取路徑接收並處理取消。Node.js 文件

截至查核時,議題仍開啟,尚未確認正式修補狀態。後續關鍵是維護者如何定義串流期限:涵蓋整段回應,或另設無資料進展的閒置逾時。依此問題推論,回歸測試也應涵蓋正常結束、讀取失敗與主動銷毀,並確認錯誤能傳到消費端,避免只延長計時器卻留下清理或錯誤傳遞缺口。

來源

  1. Node.js SDK timeout stops applying after a streaming response is returned · Issue #45198
  2. Node.js Global objects — AbortController and AbortSignal