背景
如果數(shù)據(jù)在同一個服務(wù)的同一個數(shù)據(jù)庫,通過SQL即可查詢相對比較簡單,但當(dāng)數(shù)據(jù)被分布到不同服務(wù)不同的數(shù)據(jù)庫中時,訪問組合數(shù)據(jù)的操作就變的比較困難。針對這個問題,本文描述了服務(wù)讀取不同服務(wù)的數(shù)據(jù)庫的幾種方法:服務(wù)間通信模式、數(shù)據(jù)緩存模式、數(shù)據(jù)復(fù)制模式、數(shù)據(jù)共享模式
本文的觀點(diǎn)源自我在日常學(xué)習(xí)與實(shí)踐過程中的思考,尚處于不斷探索和驗(yàn)證的階段。希望能“拋磚引玉”,激發(fā)更多的討論與交流。讓我們共同進(jìn)步,在探討與實(shí)證中尋求真知。
一、服務(wù)通信模式
如果一個服務(wù)需要讀取它無法直接訪問的數(shù)據(jù)庫,只需要使用遠(yuǎn)程調(diào)用比如RPC協(xié)議訪問另外一個服務(wù)即可,這也是很多團(tuán)隊(duì)采用的一種方式,如下圖:
這看起來很簡單,但技術(shù)充滿挑戰(zhàn)問題
?首先是數(shù)據(jù)網(wǎng)絡(luò)延遲導(dǎo)致服務(wù)A性能下降。
?服務(wù)之間的耦合,為了滿足服務(wù)A的訪問量,B服務(wù)必須隨著A服務(wù)的流量規(guī)模變化而變化。
服務(wù)通信模式優(yōu)缺點(diǎn) | |
優(yōu)點(diǎn) | 1、沒有數(shù)據(jù)量問題 |
缺點(diǎn) | 1、網(wǎng)絡(luò)延遲導(dǎo)致性能問題,很常見的TP99跳點(diǎn),抖動現(xiàn)象 2、可伸縮性和吞吐量問題 3、可用性問題 |
二、數(shù)據(jù)緩存模式
在上面服務(wù)通信的基礎(chǔ)上加上緩存,這是很多團(tuán)隊(duì)使用的第二種方式。數(shù)據(jù)保存在每個服務(wù)的內(nèi)存中并持續(xù)同步,因此服務(wù)擁有完全相同的數(shù)據(jù)。緩存又分為本地緩存+分布式緩存的組合關(guān)系。
1.單機(jī)本地緩存,每個服務(wù)都包含自己的數(shù)據(jù)。這種模式對應(yīng)服務(wù)之間無法共享,比如服務(wù)啟動加載數(shù)據(jù)到本地緩存。
2.分布式緩存:數(shù)據(jù)服務(wù)之間共享。但這種模式不是有效的復(fù)制緩存模式,因?yàn)樗荒芙鉀Q服務(wù)間通信模式下存在的容錯性問題,獲取數(shù)據(jù)從服務(wù)調(diào)用變成了緩存服務(wù)。其次由于緩存數(shù)據(jù)是中心化及共享的,打破數(shù)據(jù)所有權(quán),并且可能導(dǎo)致緩存和數(shù)據(jù)庫數(shù)據(jù)不一致。
以下是每種實(shí)現(xiàn)方式優(yōu)缺點(diǎn)如下:
實(shí)現(xiàn)方式一:本地緩存/分布式緩存+RPC遠(yuǎn)程調(diào)用
實(shí)現(xiàn)方式一:緩存前置(本地緩存/分布式緩存+RPC遠(yuǎn)程調(diào)用),它的核心思想是利用緩存來減少對遠(yuǎn)程服務(wù)的調(diào)用次數(shù),從而提高系統(tǒng)的性能和響應(yīng)速度 | |
優(yōu)點(diǎn) | 1、減少延遲:通過從本地或分布式緩存中讀取數(shù)據(jù),可以顯著減少對遠(yuǎn)程服務(wù)的調(diào)用次數(shù),從而降低響應(yīng)時間和提高用戶體驗(yàn) 2、減輕遠(yuǎn)程服務(wù)壓力:緩存可以吸收大量讀請求,減少遠(yuǎn)程服務(wù)的負(fù)載,特別是在高流量場景下。 |
缺點(diǎn) | 1、數(shù)據(jù)一致性問題:緩存中的數(shù)據(jù)可能會過時,如果遠(yuǎn)程服務(wù)的數(shù)據(jù)發(fā)生變化,緩存中的數(shù)據(jù)需要及時更新,否則可能會導(dǎo)致數(shù)據(jù)不一致。 2、復(fù)雜性增加:緩存策略的引入增加了系統(tǒng)的復(fù)雜性,需要考慮緩存更新、失效策略、數(shù)據(jù)一致性保證等問題。 3、資源消耗:緩存需要占用額外的存儲空間,如果數(shù)據(jù)量很大,緩存可能會消耗大量內(nèi)存或磁盤空間。 |
實(shí)現(xiàn)方式二:通過RPC服務(wù)通訊同步推送數(shù)據(jù)+本地緩存
實(shí)現(xiàn)方式二:通過RPC服務(wù)通訊同步推送數(shù)據(jù)+本地緩存 | |
優(yōu)點(diǎn) | 1)實(shí)時性:服務(wù)B在數(shù)據(jù)發(fā)生變化時立即推送,服務(wù)A可以實(shí)時獲取最新數(shù)據(jù)。 2)資源利用率高:只有在數(shù)據(jù)發(fā)生變化時才會進(jìn)行通信,減少了無謂的資源消耗。 3)減少輪詢壓力:避免了定時任務(wù)輪詢對服務(wù)器的壓力。 |
缺點(diǎn) | 1)復(fù)雜性:需要在服務(wù)B中實(shí)現(xiàn)推送邏輯,增加了系統(tǒng)的復(fù)雜性。 2)維護(hù)成本:推送機(jī)制需要額外的維護(hù),包括失敗重試、消息順序保證等 |
實(shí)現(xiàn)方式三:通過定時任務(wù)worker,服務(wù)A通過RPC調(diào)用服務(wù)B拉數(shù)據(jù)
實(shí)現(xiàn)方式三:通過定時任務(wù)worker,服務(wù)A通過RPC調(diào)用服務(wù)B拉數(shù)據(jù) | |
優(yōu)點(diǎn) | 1)無需變更現(xiàn)有服務(wù):不需要修改服務(wù)B的代碼,只需在服務(wù)A中添加定時任務(wù)。 |
缺點(diǎn) | 1)性能開銷:頻繁的定時任務(wù)可能會對服務(wù)A和服務(wù)B的性能產(chǎn)生一定影響。 2)延遲性:數(shù)據(jù)更新可能存在延遲,特別是如果定時任務(wù)的頻率不高。 3)資源占用:即使沒有數(shù)據(jù)更新,定時任務(wù)也會占用系統(tǒng)資源。 4)靈活性差:如果數(shù)據(jù)更新頻率變化較大,固定周期的定時任務(wù)可能不夠靈活 |
實(shí)現(xiàn)方式四:通過異步MQ獲取數(shù)據(jù)
實(shí)現(xiàn)方式四:通過異步MQ獲取數(shù)據(jù) | |
優(yōu)點(diǎn) | 1)異步、削峰、解耦:服務(wù)B在數(shù)據(jù)發(fā)生變化時只需發(fā)送消息,不需要等待服務(wù)A的處理結(jié)果。 2)容錯性:MQ通常提供消息持久化機(jī)制,即使服務(wù)A暫時不可用,消息也不會丟失。 |
缺點(diǎn) | 1)復(fù)雜性:引入MQ增加了系統(tǒng)的復(fù)雜性,需要考慮消息的順序性、消息丟失、重復(fù)消費(fèi)等問題。 2)延遲:雖然MQ可以提供實(shí)時消息傳遞,但在高并發(fā)或者網(wǎng)絡(luò)問題的情況下,仍然可能存在延遲。 |
緩存模式優(yōu)缺點(diǎn):
緩存模式優(yōu)缺點(diǎn) | |
優(yōu)點(diǎn) | 1、提高了數(shù)據(jù)訪問性能 2、沒有可伸縮性和吞吐量問題 3、良好容錯性 |
缺點(diǎn) | 1、大數(shù)據(jù)量不友好(比如200M),可行性降低 2、高頻更新不友好,無法保持完全同步,對于相對靜態(tài)數(shù)據(jù),比較合適 3、緩存數(shù)據(jù)和服務(wù)啟動的服務(wù)依賴關(guān)系。常見機(jī)器擴(kuò)容N臺機(jī)器,N臺同時通過RPC訪問服務(wù)B,導(dǎo)致服務(wù)B流量暴漲,并且寫分布式緩存流量暴漲(N臺*每臺緩存大?。?4、適合一致性較弱的場景,緩存一致性問題,可能導(dǎo)致數(shù)據(jù)陳舊 |
三、數(shù)據(jù)復(fù)制模式
在數(shù)據(jù)復(fù)制模式中,表之間會進(jìn)行數(shù)據(jù)復(fù)制,也就是在數(shù)據(jù)庫A冗余數(shù)據(jù)庫B數(shù)據(jù)。這樣可以確保服務(wù)A直接訪問數(shù)據(jù)庫A獲取到數(shù)據(jù)庫B的數(shù)據(jù)??梢酝ㄟ^很多種實(shí)現(xiàn)方式:
但這同樣存在如下問題:如何管理數(shù)據(jù)所有權(quán)?到處都有這種數(shù)據(jù),數(shù)據(jù)一致性問題
實(shí)現(xiàn)方式四:binlog同步,需要注意binlog數(shù)據(jù)量 | |
優(yōu)點(diǎn) | 1)實(shí)時性:Binlog可以捕獲數(shù)據(jù)庫的實(shí)時變化,使得數(shù)據(jù)同步具有較低的延遲。 |
缺點(diǎn) | 1)性能影響:雖然Binlog的開銷相對較小,但在高并發(fā)寫入的場景下,Binlog的生成和處理仍然會對數(shù)據(jù)庫性能產(chǎn)生一定影響。 2)依賴數(shù)據(jù)庫:這種同步方式依賴于MySQL的Binlog功能 |
這種方案改善了上面服務(wù)通信的性能,容錯性,可伸縮性問題。某些場景可用,比如聚合,報(bào)表或者其他不適合高性能需求,高容錯性的時候
數(shù)據(jù)復(fù)制模式優(yōu)缺點(diǎn) | |
優(yōu)點(diǎn) | 1、良好的數(shù)據(jù)訪問性能 2、沒有可伸縮性和吞吐量問題 3、沒有容錯性問題 4、沒有服務(wù)直接依賴 |
缺點(diǎn) | 1、數(shù)據(jù)一致性問題 2、數(shù)據(jù)歸屬權(quán)問題 3、需要數(shù)據(jù)同步 |
四、數(shù)據(jù)共享模式
如果上面的3種方式都不行,那可以用兜底方式,用創(chuàng)建數(shù)據(jù)領(lǐng)域,把數(shù)據(jù)組合到共享的數(shù)據(jù)庫,讓服務(wù)A和服務(wù)B都能訪問。
服務(wù)之間完全解耦,解決了可用性依賴,響應(yīng)性,吞吐量和可伸縮性問題
數(shù)據(jù)庫共享模式優(yōu)缺點(diǎn) | |
優(yōu)點(diǎn) | 1、良好的數(shù)據(jù)訪問性能 2、沒有可伸縮性和吞吐量問題 3、良好容錯性 4、無服務(wù)依賴 5、數(shù)據(jù)保持一致 |
缺點(diǎn) | 1、數(shù)據(jù)所有權(quán)治理 2、數(shù)據(jù)訪問安全 |
總結(jié)
1.通過本文的探討,大家可以更全面地了解分布式數(shù)據(jù)訪問的挑戰(zhàn)和可能的解決方案
2.每種模式都有其優(yōu)勢和不足以及應(yīng)用場景,本文旨在通過對比分析,為實(shí)際應(yīng)用中的選擇提供指導(dǎo)。
3.如果以上文案有問題或者還有更好的方案,歡迎評論區(qū)留言補(bǔ)充完善,謝謝
審核編輯 黃宇
-
SQL
+關(guān)注
關(guān)注
1文章
762瀏覽量
44115 -
數(shù)據(jù)庫
+關(guān)注
關(guān)注
7文章
3794瀏覽量
64360 -
RPC
+關(guān)注
關(guān)注
0文章
111瀏覽量
11529 -
分布式
+關(guān)注
關(guān)注
1文章
895瀏覽量
74498 -
數(shù)據(jù)訪問
+關(guān)注
關(guān)注
0文章
9瀏覽量
6544
發(fā)布評論請先 登錄
相關(guān)推薦
評論