結論:web
1、背景及問題描述sql
業務背景:數據庫
商戶提交表單數據至旺鋪(deco項目,如下皆稱爲deco),deco須要接入poi系統進行裝修內容的人工審覈,詳細流程見下圖。服務器
問題:網絡
店鋪裝修審覈狀態在deco系統和poi系統之間不一致,下圖中1,2,3步提交流程會出現同一次提交審覈流在deco系統中的裝修狀態爲未裝修,而在poi系統爲審覈中。一樣在4,5,6步驟的審覈回調過程也會有同類的狀態不一致問題。兩塊問題都是同一技術問題,本文只以1,2,3步提交過程爲例進行分析解決。異步
2、問題分析 1. 關係型數據事務在分佈式系統中的問題分佈式
從業務中抽離出來,問題的核心緣由可用下圖流程模型來描述。ide
系統A的某個業務功能包含兩步操做,第一步把數據寫入A系統本地庫,第二步遠程調用系統B,這兩步操做在A系統用一個數據庫事務來包裝。僞代碼以下:微服務
$db->begain(); // 第一步操做本地數據庫 $res = $db->update($sql_a); if (!$res) { $db->rollback(); return; } // 第二步遠程調用B系統 $res = $http_request->get($url_b); if ('success' != $res) { $db->rollback(); return; } $db->commit();
第一步有兩種結果成功、失敗,第二步則有3種結果成功、失敗、超時,其中致使超時緣由多是網絡中斷,也多是B系統服務異常。那麼咱們根據兩步驟的執行結果狀況來分別分析一下是否會致使A、B系統之間的數據不一致。網站
可得當第一步執行成功,第二步遠程調用超時時,A系統事務會回滾,那麼就發生A、B系統數據不一致的狀況,A庫中寫入失敗,可是B庫中卻成功寫入。咱們習慣於使用關係型數據庫事務的ACID特性來達到一致性的目的,可是當事務中發生跨系統的調用時ACID就無效了,只從數據庫層面來看,跨系統就意味着同一個業務存在多個數據副本,對應着不一樣的數據庫實例,並且分佈在不一樣的機器上,而關係型數據庫的事務只是針對同一個庫的同一個connection而言的。
2.那麼怎麼解決跨系統的數據一致性問題?
咱們先從新認識一下什麼是一致性?首先想到的是關係型數據庫事務,又會想到最經典的甲給乙轉錢的例子,事務的四大基本特性ACID保證了甲帳戶扣錢和乙帳戶入錢同時發生或同時不發生,其中的C特性就是指一致性,它是指數據庫事務不能破壞關係數據的完整性以及業務邏輯上的一致性。在web2.0以前大部分網站或者項目都是單系統,對應底層存儲也只是單數據庫,因此使用數據庫自己的事務特性就知足了一致性。
可是隨着互聯網用戶和數據量的指數級增加,對於每一個系統的計算能力、吞吐量以及響應速度的要求都大大提升,因而單節點服務器確定知足不了要求,因此都在考慮拆分和系統擴展性,不管是通過水平拆分仍是垂直拆分,單機系統就變成了分佈式系統,分佈式系統就確定存在某節點或者網絡故障的狀況,以前說的事務的ACID中的強一致性就沒法保證。
再回到咱們的問題上來,poi系統其實就能夠理解爲垂直拆分出的一個微服務,deco調用poi的提交審覈接口就是分佈式系統之間的調用,可是deco中仍然用關係型數據庫的事務來達到強一致性的目的,根據CAP理論 CAP原則 (阿里),分佈式系統的一致性、可用性、分區容錯性不可能同時獲得知足,只能知足其中兩個,而分佈式系統的分區容錯性都須要獲得知足,因此就須要在一致性和可用性之間進行取捨。Deco的這種實現其實就是爲了保證一致性,而犧牲了可用性。
而對於如今的系統而言,可用性是相當重要的必需要保證,要作到即便poi系統出現偶爾的網絡故障或者超時,也儘量不要用戶的一次提交失敗掉。
再來了解一個概念BASE理論,BASE理論是CAP理論的一種實現,它對分佈式系統的一致性和可用性不可兼得的問題提出了一種方案,即基本可用和最終一致是目標。既然提到了強一致性和最終一致性,再介紹一下業界對一致性的分層次定義。
對上面幾段分析的總結就是:關係型數據庫的事務能夠知足單系統的強一致性,大部分分佈式系統只能把最終一致性做爲追求。而咱們的deco和poi系統顯然也是應該追求最終一致性,由於對於poi和deco之間裝修審覈數據出現短期的不一致是徹底能夠接受的。
3、解決方案
基於上述理論,咱們能夠有如下兩種方案來達到可用性和最終一致性:
方案1、
解耦,異步任務處理,由原來同步調用poi系統變爲異步調用,將deco系統信息入庫和調用poi建立審覈任務這兩個操做分開。
方案2、
引入消息隊列,至關於對方案一的升級版。