繁體中文(台灣)
事後分析:使用者登入時發生意外的 500 錯誤
2024 年 7 月 18 日,身份驗證服務返回的意外 500 錯誤的事件報告。
2024 年 7 月 18 日,身份驗證服務返回的意外 500 錯誤的事件報告。
2024 年 7 月 18 日,Logto Cloud 發生了服務中斷,身份驗證服務返回 500 內部服務器錯誤。
在最近的一次 Cloud 部署中,資料庫結構的重大變更導致在從暫存環境到生產環境的過渡期間,登入體驗 API 發生故障。
我們目前正在開發一個名為「自定義 UI」的新功能,允許使用者使用自己的網頁自定義 Logto 的登入體驗。此功能需要在 sign-in-exp 表中新增一列用於存儲自定義的 UI 配置。
由於開發過程中的需求變更,功能發布被推遲,但資料庫結構變更的第一部分已經在幾週前部署到生產環境中,即便尚未投入使用。 資料庫列的更新已在此 PR中引入。
不幸的是,此變更不向後兼容,導致來自舊代碼的 API 請求在與新資料庫通信時失敗。
在部署 Logto Cloud 的新版本時,我們首先將其部署到暫存環境,然後交換暫存和生產環境。 過程如下:
然而,兩個環境共享同一個資料庫,整個過程需要時間。所以在資料庫更新和環境交換之間的時間窗口內,線上使用者仍處於擁有舊代碼的生產環境但試圖與新資料庫通信的狀態。
這是事件的根本原因,也是它在 35 分鐘內自動解決的原因。
我們確實有一個 CI 任務來檢查資料庫變更的向後兼容性。然而,以前在合併 PR 之前不需要通過 CI 檢查。這是因為大多數時候開發階段通常在幾個短期迭代內完成,並且第一和第二部分的結構變更通常包含在同一個版本階段中。
這一次,功能發布被推遲,使結構變更分布在兩個發布中。開發人員認為 CI 失敗是預期的,並通知審查員它不應該阻止合併 PR。
確實存在溝通障礙,最終在沒有提供必要的向後兼容性支持的情況下合併了 PR。