跳至主要內容

1 篇文章 含有標籤「prisma」

檢視所有標籤

事件報告:Prisma DB 重連會阻塞事件迴圈並終止存活檢查

Yuneng Jiang
Senior SWE @ LiteLLM

日期: 2026 年 4 月 持續時間: 修正上線前,跨多個客戶部署發生多次事故 嚴重性: 高;在 Kubernetes 中表現為完整的 proxy 服務中斷 狀態: 已解決

注意: 此修正自包含 PR #26225 的版本開始可用(於 2026 年 4 月 29 日合併)。

摘要​

當上游 Postgres 資料庫變得無法連線時,LiteLLM proxy 的 Prisma 重連路徑會呼叫 await self.db.disconnect()。在 prisma-client-py 下,該呼叫會在 Rust query-engine 子處理程序上觸發一個同步的 subprocess.Popen.wait()。由於 wait() 不會讓出執行權,只要引擎關閉所需的時間,asyncio 事件迴圈就會卡死;在生產環境中,當引擎卡在對無回應資料庫的 TCP close 操作上時,這通常會持續 30–120 秒。

在迴圈凍結期間,沒有任何 coroutine 會執行,包括 /health/liveliness。Kubernetes 的存活探針逾時,kubelet 便以 SIGKILL 終止該 pod。從操作人員的角度來看,proxy 彷彿已經死亡,儘管根本問題其實只是 reconnect 邏輯本應撐過去的暫時性 DB 中斷。

影響: 任何 Postgres 短暫變得無回應的客戶,都會看到 proxy pod 被終止並重新啟動,而不是在 DB 恢復後優雅降級並重新連線。此問題由 FLock 對外回報,並在內部重現。