一:分布式
????????分布式是一種架構(gòu)模式,是將公有模塊進(jìn)行提取,構(gòu)建成單獨(dú)的模塊,部署在不同服務(wù)器上進(jìn)行調(diào)用。分布式系統(tǒng)一定是由多個(gè)節(jié)點(diǎn)組成的系統(tǒng)(這些節(jié)點(diǎn)一般不是孤立的,而是互通的);節(jié)點(diǎn)之間相互的操作會(huì)有協(xié)同。
特點(diǎn):
??????? 1.增大系統(tǒng)容量
??????? 2.加強(qiáng)系統(tǒng)可用
??????? 3.系統(tǒng)模塊重用度高
??????? 4.模塊被拆分,開(kāi)發(fā)和發(fā)布速度可以并行而變得更快
??????? 5.系統(tǒng)擴(kuò)展性更高
類型:
??????? 1.分布式處理,但只有一個(gè)總數(shù)據(jù)庫(kù),沒(méi)有局部數(shù)據(jù)庫(kù)
??????? 2.分層式處理,每一層都有自己的數(shù)據(jù)庫(kù)
??????? 3.充分分散的分布式網(wǎng)絡(luò),沒(méi)有中央控制部分,各節(jié)點(diǎn)之間的聯(lián)系方式又可以有多種
二、分布式理論
CAP理論
????????CAP理論:又稱為布魯爾定理;CAP是一致性、可用性、分區(qū)容錯(cuò)性的首字母組合;CAP定理指出對(duì)于一個(gè)分布式系統(tǒng)來(lái)說(shuō)需滿足以下三點(diǎn)中的兩點(diǎn)(分區(qū)容錯(cuò)性一定要滿足,一致性和可用性二選一):
????????一致性:所有節(jié)點(diǎn)訪問(wèn)同一份最新的數(shù)據(jù)副本
????????可用性:非故障的節(jié)點(diǎn)在合理的時(shí)間內(nèi)返回合理的響應(yīng)
????????分區(qū)容錯(cuò)性:分布式系統(tǒng)出現(xiàn)網(wǎng)絡(luò)分區(qū)的時(shí)候,仍然能夠?qū)ν馓峁┓?wù)
網(wǎng)絡(luò)分區(qū):分布式系統(tǒng)中,多個(gè)節(jié)點(diǎn)之前的網(wǎng)絡(luò)本來(lái)是連通的,但是因?yàn)槟承┕收希ū热绮糠止?jié)點(diǎn)網(wǎng)絡(luò)出了問(wèn)題)某些節(jié)點(diǎn)之間不連通了,整個(gè)網(wǎng)絡(luò)就分成了幾塊區(qū)域。
總結(jié):
??????? 1.在系統(tǒng)發(fā)生“分區(qū)”的情況下,CAP 理論只能滿足 CP 或者 AP。要注意的是,這里的前提是系統(tǒng)發(fā)生了“分區(qū)”
??????? 2.如果系統(tǒng)沒(méi)有發(fā)生“分區(qū)”的話,節(jié)點(diǎn)間的網(wǎng)絡(luò)連接通信正常的話,也就不存在 P 了。這個(gè)時(shí)候,我們就可以同時(shí)保證 C 和 A 了
??????? 3.如果系統(tǒng)發(fā)生“分區(qū)”,我們要考慮選擇 CP 還是 AP。如果系統(tǒng)沒(méi)有發(fā)生“分區(qū)”的話,我們要思考如何保證 CA
BASE理論
??????? BASE:基本可用、軟狀態(tài)、最終一致性的縮寫;BASE理論是對(duì)CAP中的一致性C和可用性A權(quán)衡的結(jié)果是基于 CAP 定理逐步演化而來(lái)的,它大大降低了我們對(duì)系統(tǒng)的要求。
????????核心思想:即使無(wú)法做到強(qiáng)一致性,但每個(gè)應(yīng)用都可以根據(jù)自身業(yè)務(wù)特點(diǎn),采取適當(dāng)?shù)姆绞絹?lái)使系統(tǒng)達(dá)到強(qiáng)一致性(也就是犧牲數(shù)據(jù)的一致性來(lái)滿足系統(tǒng)的高可用性,系統(tǒng)中一部分?jǐn)?shù)據(jù)不可用或者不一致時(shí),仍需要保持系統(tǒng)整體“主要可用”)。
??????? 基本可用:指分布式系統(tǒng)在出現(xiàn)不可預(yù)知故障的時(shí)候,允許損失部分可用性。但是,這絕不等價(jià)于系統(tǒng)不可用。(響應(yīng)時(shí)間上的損失、系統(tǒng)功能上的損失)
??????? 軟狀態(tài):軟狀態(tài)指允許系統(tǒng)中的數(shù)據(jù)存在中間狀態(tài)(CAP 理論中的數(shù)據(jù)不一致),并認(rèn)為該中間狀態(tài)的存在不會(huì)影響系統(tǒng)的整體可用性,即允許系統(tǒng)在不同節(jié)點(diǎn)的數(shù)據(jù)副本之間進(jìn)行數(shù)據(jù)同步的過(guò)程存在延時(shí)。
??????? 最終一致性:系統(tǒng)中所有的數(shù)據(jù),在經(jīng)過(guò)一段時(shí)間的同步后,最終能夠達(dá)到一個(gè)一致的狀態(tài)。因此,最終一致性的本質(zhì)是需要系統(tǒng)保證最終數(shù)據(jù)能夠達(dá)到一致,而不需要實(shí)時(shí)保證系統(tǒng)數(shù)據(jù)的強(qiáng)一致性。
分布式一致性:
????????強(qiáng)一致性 :系統(tǒng)寫入了什么,讀出來(lái)的就是什么
????????弱一致性 :不一定可以讀取到最新寫入的值,也不保證多少時(shí)間之后讀取到的數(shù)據(jù)是最新的,只是會(huì)盡量保證某個(gè)時(shí)刻達(dá)到數(shù)據(jù)一致的狀態(tài)
????????最終一致性 :弱一致性的升級(jí)版,系統(tǒng)會(huì)保證在一定時(shí)間內(nèi)達(dá)到數(shù)據(jù)一致的狀態(tài)
如何實(shí)現(xiàn)最終一致性:
??????? 1.讀時(shí)修復(fù) : 在讀取數(shù)據(jù)時(shí),檢測(cè)數(shù)據(jù)的不一致,進(jìn)行修復(fù)
??????? 2.寫時(shí)修復(fù) : 在寫入數(shù)據(jù),檢測(cè)數(shù)據(jù)的不一致時(shí),進(jìn)行修復(fù)
??????? 3.異步修復(fù) (推薦): 這個(gè)是最常用的方式,通過(guò)定時(shí)對(duì)賬檢測(cè)副本數(shù)據(jù)的一致性,并修復(fù)
CAP 是分布式系統(tǒng)設(shè)計(jì)理論,BASE 是 CAP 理論中 AP 方案的延伸
三、分布式ID
ID:ID就是數(shù)據(jù)的唯一標(biāo)識(shí)。
分布式ID:分布式系統(tǒng)下的 ID;如何為不同的數(shù)據(jù)節(jié)點(diǎn)生成全局唯一主鍵,這個(gè)時(shí)候就需要生成分布式 ID了。
分布式ID滿足條件:
??????? 1.全局唯一:ID 的全局唯一性肯定是首先要滿足的
??????? 2.高性能:分布式 ID 的生成速度要快,對(duì)本地資源消耗要小
??????? 3.高可用:生成分布式 ID 的服務(wù)要保證可用性無(wú)限接近于 100%
??????? 4.方便易用:拿來(lái)即用,使用方便,快速接入
分布式ID常見(jiàn)解決方案:
數(shù)據(jù)庫(kù):
??????? 數(shù)據(jù)庫(kù)主鍵自增:數(shù)據(jù)庫(kù)的自增主鍵產(chǎn)生來(lái)唯一的 ID,新建占位字段,創(chuàng)建了唯一索引,保證其唯一性;插入時(shí),如果主鍵或唯一索引字段出現(xiàn)重復(fù)數(shù)據(jù)錯(cuò)誤而插入失敗時(shí),先從表中刪除含有重復(fù)關(guān)鍵字值的沖突行,然后再次嘗試把數(shù)據(jù)插入到表中
??????? ????????優(yōu)點(diǎn):實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單、ID 有序遞增、存儲(chǔ)消耗空間小
??????? ????????缺點(diǎn):支持的并發(fā)量不大、每次獲取 ID 都要訪問(wèn)一次數(shù)據(jù)庫(kù)
??????? 數(shù)據(jù)庫(kù)號(hào)段模式:批量獲取ID,然后存在內(nèi)存里面,需要用到的時(shí)候,直接從內(nèi)存里面拿;基于數(shù)據(jù)庫(kù)的號(hào)段模式來(lái)生成分布式 ID(數(shù)據(jù)庫(kù)的訪問(wèn)次數(shù)更少,數(shù)據(jù)庫(kù)壓力更小);
??????? ????????優(yōu)點(diǎn):ID 有序遞增、存儲(chǔ)消耗空間小
??????? ????????缺點(diǎn):存在數(shù)據(jù)庫(kù)單點(diǎn)問(wèn)題、ID 沒(méi)有具體業(yè)務(wù)含義
??????? redis:利用命令即可實(shí)現(xiàn)對(duì) id 原子順序遞增
算法:
??????? UUID:包含 32 個(gè) 16 進(jìn)制數(shù)字,生成簡(jiǎn)單
??????????????? 優(yōu)點(diǎn):生成速度比較快、簡(jiǎn)單易用
??????????????? 缺點(diǎn):存儲(chǔ)消耗空間大、無(wú)序
??????? 雪花算法:生成64 bit的二進(jìn)制被分成了幾部分,每一部分存儲(chǔ)的數(shù)據(jù)都有特定的含義(第 1~41 位 :一共 41 位,用來(lái)表示時(shí)間戳;第 42~52 位 :一共 10 位,一般來(lái)說(shuō),前 5 位表示機(jī)房 ID,后 5 位表示機(jī)器 ID;第 53~64 位 :一共 12 位,用來(lái)表示序列號(hào))
????????????????優(yōu)點(diǎn) :生成速度比較快、生成的 ID 有序遞增、比較靈活
????????????????優(yōu)點(diǎn) :生成速度比較快、生成的 ID 有序遞增、比較靈活
開(kāi)源框架:
??????? 百度:基于雪花算法進(jìn)行了改進(jìn),生成ID的組成不一樣;
??????? 美團(tuán):基于雪花算法和號(hào)段模式
??????? 滴滴:基于數(shù)據(jù)庫(kù)號(hào)段模式的唯一 ID 生成器
四、分布式鎖
分布式鎖,分布式系統(tǒng)中的鎖;為了解決分布式系統(tǒng)中控制資源共享訪問(wèn)的問(wèn)題。
具備條件:
??????? 1.互斥:任意一個(gè)時(shí)刻,鎖只能被一個(gè)線程持有
??????? 2.高可用:釋放鎖的代碼邏輯出現(xiàn)問(wèn)題,鎖最終一定還是會(huì)被釋放,不會(huì)影響其他線程對(duì)共享資源的訪問(wèn)
??????? 3.可重入:一個(gè)節(jié)點(diǎn)獲得鎖之后,還可以再次獲得鎖
實(shí)現(xiàn)方式:
基于數(shù)據(jù)庫(kù)的分布式鎖
??????? 1.基于數(shù)據(jù)庫(kù)表的增刪:先創(chuàng)建一張鎖的表,當(dāng)需要鎖住某個(gè)方法時(shí),往該表中插入一條相關(guān)的記錄,如果有多個(gè)請(qǐng)求同時(shí)提交到數(shù)據(jù)庫(kù)的話,數(shù)據(jù)庫(kù)會(huì)保證只有一個(gè)操作可以成功,那么我們就認(rèn)為操作成功的那個(gè)線程獲得了該方法的鎖,可以執(zhí)行方法體內(nèi)容。執(zhí)行完畢之后,需要delete該記錄
??????? 2.基于數(shù)據(jù)庫(kù)的排它鎖:數(shù)據(jù)庫(kù)在查詢過(guò)程中給數(shù)據(jù)庫(kù)表增加排他鎖。獲得排它鎖的線程即可獲得分布式鎖,當(dāng)獲得鎖之后,可以執(zhí)行方法的業(yè)務(wù)邏輯,執(zhí)行完方法之后,釋放鎖。當(dāng)某條記錄被加上排他鎖之后,其他線程無(wú)法獲取排他鎖并被阻塞。
redis實(shí)現(xiàn)分布式鎖
??????? 1.基于set命令的分布式鎖:
??????? 2.基于setnx、get、getset的分布式鎖
??????? 3.基于RedLock的分布式鎖
??????? 4.基于Redisson看門狗的分布式鎖
zookeeper實(shí)現(xiàn)分布式鎖
????????基于zookeeper臨時(shí)有序節(jié)點(diǎn)可以實(shí)現(xiàn)的分布式鎖。每個(gè)客戶端對(duì)某個(gè)方法加鎖時(shí),在zookeeper上的與該方法對(duì)應(yīng)的指定節(jié)點(diǎn)的目錄下,生成一個(gè)唯一的瞬時(shí)有序節(jié)點(diǎn)。 判斷是否獲取鎖的方式很簡(jiǎn)單,只需要判斷有序節(jié)點(diǎn)中序號(hào)最小的一個(gè)。 當(dāng)釋放鎖的時(shí)候,只需將這個(gè)瞬時(shí)節(jié)點(diǎn)刪除即可。
五、分布式事務(wù)
分布式事務(wù)是指在分布式系統(tǒng)中實(shí)現(xiàn)事務(wù),它其實(shí)是由多個(gè)本地事務(wù)組合而成;分布式事務(wù)而言幾乎滿足不了 ACID。
分布式事務(wù)方案:
1.2PC/3PC
2PC:二階段提交。?二階段提交是一種強(qiáng)一致性設(shè)計(jì),2PC 引入一個(gè)事務(wù)協(xié)調(diào)者的角色來(lái)協(xié)調(diào)管理各參與者的提交和回滾,二階段分別指的是準(zhǔn)備和提交兩個(gè)階段:
????????準(zhǔn)備階段:協(xié)調(diào)者會(huì)給各參與者發(fā)送準(zhǔn)備命令,做完提交事務(wù)之外的所有事情
????????提交階段:提交或回滾事務(wù)
3PC: 是為了解決 2PC 的一些問(wèn)題,相比于 2PC 它在參與者中也引入了超時(shí)機(jī)制,并且新增了一個(gè)階段使得參與者可以利用這一個(gè)階段統(tǒng)一各自的狀態(tài)(預(yù)提交階段);
不管哪一個(gè)階段有參與者返回失敗都會(huì)宣布事務(wù)失?。?/p>
思想:先試探性的執(zhí)行,如果都可以那就真正的執(zhí)行,如果不行就回滾
2.本地消息表
本地消息表:利用了各系統(tǒng)本地的事務(wù)來(lái)實(shí)現(xiàn)分布式事務(wù);
????????會(huì)有一張存放本地消息的表,一般都是放在數(shù)據(jù)庫(kù)中,然后在執(zhí)行業(yè)務(wù)的時(shí)候?將業(yè)務(wù)的執(zhí)行和將消息放入消息表中的操作放在同一個(gè)事務(wù)中,這樣就能保證消息放入本地表中業(yè)務(wù)肯定是執(zhí)行成功的。
本地消息表其實(shí)實(shí)現(xiàn)的是最終一致性,容忍了數(shù)據(jù)暫時(shí)不一致的情況
3.事務(wù)消息
事務(wù)消息是通過(guò)消息中間件來(lái)解耦本地消息表和業(yè)務(wù)數(shù)據(jù)表,適用于所有對(duì)數(shù)據(jù)最終一致性需求的場(chǎng)景?,F(xiàn)在支持事務(wù)消息的消息中間件只有RocketMQ,這個(gè)概念最早也是RocketMQ提出的。
流程:發(fā)起方發(fā)送半事務(wù)消息會(huì)給RocketMQ,發(fā)起方進(jìn)行本地事務(wù)操作,后確認(rèn)提交消息,此時(shí)接受方可以消費(fèi)到此消息了。
4.TCC
TCC 是業(yè)務(wù)層面的分布式事務(wù);(預(yù)留-確認(rèn)操作-撤銷操作);都是先試探性的執(zhí)行,如果都可以那就真正的執(zhí)行,如果不行就回滾;
????????比如說(shuō)一個(gè)事務(wù)要執(zhí)行A、B、C三個(gè)操作,那么先對(duì)三個(gè)操作執(zhí)行預(yù)留動(dòng)作。如果都預(yù)留成功了那么就執(zhí)行確認(rèn)操作,如果有一個(gè)預(yù)留失敗那就都執(zhí)行撤銷動(dòng)作。
TCC可以跨數(shù)據(jù)庫(kù)、跨不同的業(yè)務(wù)系統(tǒng)來(lái)實(shí)現(xiàn)事務(wù)
5.Saga
Saga事務(wù)模型又叫做長(zhǎng)時(shí)間運(yùn)行的事務(wù);
????????核心思想就是拆分分布式系統(tǒng)中的長(zhǎng)事務(wù)為多個(gè)短事務(wù),或者叫多個(gè)本地事務(wù),然后由 Saga工作流引擎負(fù)責(zé)協(xié)調(diào),如果整個(gè)流程正常結(jié)束,那么就算是業(yè)務(wù)成功完成,如果在這過(guò)程中實(shí)現(xiàn)失敗,那么Saga工作流引擎就會(huì)以相反的順序調(diào)用補(bǔ)償操作,重新進(jìn)行業(yè)務(wù)回滾。?
6.Seate
Seata是一個(gè)由阿里做背書的分布式事務(wù)框架,致力于提供高性能和簡(jiǎn)單易用的分布式事務(wù)服務(wù)。
????????特點(diǎn)是對(duì)業(yè)務(wù)無(wú)入侵,用戶只需關(guān)注自己的“業(yè)務(wù) SQL”,用戶的 “業(yè)務(wù) SQL” 作為一階段,Seata 框架會(huì)自動(dòng)生成事務(wù)的二階段提交和回滾操作。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-416521.html
特點(diǎn)是對(duì)業(yè)務(wù)無(wú)入侵,用戶只需關(guān)注自己的“業(yè)務(wù) SQL”,用戶的 “業(yè)務(wù) SQL” 作為一階段,Seata 框架會(huì)自動(dòng)生成事務(wù)的二階段提交和回滾操作文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-416521.html
到了這里,關(guān)于java 分布式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!