【Bug】MQ消息與事務提交


項目聯調期間,遇到個bug,涉及MQ消息傳遞和事務提交時間問題,簡單記錄下。

背景

審核服務(審核創建項目),點擊審核通過,后台代碼會在提交事務前發送MQ消息(該消息由項目管理服務消費),發送成功后,審核通過的事務才會提交(存入數據庫),該次審核記錄的狀態更新為審核通過。示意圖如下:

 

 

項目管理服務消費申請創建項目通過的消息(上文所述MQ消息),創建對應項目名稱項目。創建項目時,要求項目名未使用(已創建項目集合中無同名項目、沒有審核中的申請創建同名項目流程),否則創建項目失敗(報錯:xxx項目名已存在)。示意圖如下:

 

現狀

預期:審核通過申請創建項目的流程,項目管理服務能夠成功創建同名項目。

實際:審核通過申請創建項目的流程,項目管理服務創建同名項目失敗(偶爾成功),提示項目名已存在。

 

分析

單用戶操作,不存在並發問題,且已有項目集合中無同名項目。

審核服務用於判斷“是否有審核中的創建同名項目的申請”的接口,業務實現正確。

原因:審核通過,發送MQ成功后,再進行數據庫操作並提交事務。在提交事務前,項目管理服務已消費消息並發起項目名重復校驗。此時對應流程還是審核中。

按常理分析,審核服務內部的事務處理速度,應該比項目管理服務接收消息&創建項目&調用審核服務校驗項目名接口速度快,但是現實環境確實出現了該問題。

 

可能原因:

1. 項目部署環境All in one,都是在同一台機器上,包括MQ。網絡延遲小。

2. 審核服務提交事務,數據庫因數據量、業務邏輯、磁盤性能等等原因,導致耗時過長。

簡單來說,按照原場景,在事務提交前,確實有個時間差。

 

解決:

臨時方案 - 項目管理服務對於來自審核服務創建項目的請求,不判斷是否有審核中的同名項目申請(由審核服務在申請發起時自行校驗)

個人推薦 - 審核服務通過申請時,先提交數據庫事務,可以根據業務設計,將申請流程置位中間狀態(如審核通過(待確認創建成功))。再發送MQ消息,若MQ發送失敗,重置之前那條審核流程的狀態(改為審核通過創建失敗,或者回滾為審核中)

 

反思

在強約束要求下,優先數據入庫,再進行其他操作。

同時,實現功能前,需要考慮服務間時延、服務/組件不可用等情況。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM