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