Java互聯網架構-微服務架構如何解決跨庫問題的思路與方案?

瘋癲冬瓜

我們公司使用的就是微服務加分庫分表,一般來說如果應用系統出現性能瓶頸或者業務代碼耦合過重,可考慮使用微服務架構,而後端的數據庫通常使用讀寫分離,雙主互備或者是分庫分表來實現性能的提升和數據服務的高可用。



在數據分佈在不同的數據庫服務器的帶來良好性能的同時,新的問題也隨之而來,比如說數據一致性的保證,性能監控,數據存取複雜等,而較為突出的就是數據跨庫問題!數據分佈在不同的節點上,導致原來的連接查詢需要跨庫,字段的主鍵難以保證唯一,跨庫的事務處理複雜,下面逐一解決:

1,連接查詢(join)問題:因為庫表分佈在不同的機器上,連接查詢失效。

解決辦法:

①,代碼解決:根據某個字段進行hash的方式進行分庫分表,保證落在一個庫中的類似表中(比如aa_00.t_user_0000和aa_00.t_member_0000),然後基於這樣的規則在代碼中進行連接查詢語句書寫!

②,同步:將常用的,需要的字段同步到一個庫中進行聯合查詢!

③,冗餘:在一個庫中冗餘更多的連接查詢需要的字段,保證全部數據都能查詢到!


2,唯一主鍵:如果使用傳統的自增等方式,多庫中的主鍵id勢必重複,所以需要對唯一性加以控制!

解決方法:UUID(根據機器ID,時間等),redis(單線程保證不重複),snowflake算法!

3,分佈式事務:

1,TCC:try控制業務代碼流程,Confirm確認事務的正確性,cancel取消失敗的事務!

2,基於消息系統的一致性方案:單節點事務完成後,通過發送消息保證事務提交,如果失敗可通過重試,任務補償等方式保證數據一致性!

總的來說,分佈式系統有著很多以往不存在的問題,還需要具體問題具體分析,可一起交流,更多的技術分享,敬請關注。。。


分享到:


相關文章: