九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
諧云課堂 | 一文詳解分布式改造理論與實(shí)戰(zhàn)

01

微服務(wù)與分布式

什么是分布式?

首先,我們對(duì)上圖提到的部分關(guān)鍵詞進(jìn)行講解。

單體,是指一個(gè)進(jìn)程完成全部的后端處理;水平拆分,是同一個(gè)后端多環(huán)境部署,他們都處理相同的內(nèi)容,使用反向代理來均衡負(fù)載,這種也叫集群;垂直拆分,則是把不同業(yè)務(wù)拆分為各個(gè)節(jié)點(diǎn),反向代理通過路由將請(qǐng)求分發(fā)給每個(gè)業(yè)務(wù)節(jié)點(diǎn)上。

分布式,就是不同的組件或者同一個(gè)組件在多個(gè)機(jī)器節(jié)點(diǎn)上部署,關(guān)鍵在于是否通過交換信息的方式進(jìn)行協(xié)作,也就是說,分布式是指通過網(wǎng)絡(luò)連接的多個(gè)組件,通過交換信息協(xié)作而形成的系統(tǒng)。而集群,是指同一種組件的多個(gè)實(shí)例,形成的邏輯上的整體,它們之間不會(huì)互相通信。

分布式和微服務(wù)有何不同?

簡(jiǎn)單來說,微服務(wù)是很小的服務(wù),一個(gè)服務(wù)可能負(fù)責(zé)幾個(gè)功能或者一個(gè)業(yè)務(wù),是一種面向SOA架構(gòu)的,服務(wù)之間也是通過RPC來交互或者是webservice來交互的,這個(gè)服務(wù)可以單獨(dú)部署運(yùn)行,每個(gè)微服務(wù)都是由獨(dú)立的小團(tuán)隊(duì)開發(fā),測(cè)試,部署,上線,負(fù)責(zé)它的整個(gè)生命周期。

再說分布式系統(tǒng),其是由一組通過網(wǎng)絡(luò)進(jìn)行通信、為了完成共同的任務(wù)而協(xié)調(diào)工作的計(jì)算機(jī)節(jié)點(diǎn)組成的系統(tǒng)分布式服務(wù)顧名思義服務(wù)是分散部署在不同的機(jī)器上的,微服務(wù)架構(gòu)是面向邏輯的架構(gòu)。邏輯架構(gòu)設(shè)計(jì)完后就該做物理架構(gòu)設(shè)計(jì),系統(tǒng)應(yīng)用部署在超過一臺(tái)服務(wù)器或虛擬機(jī)上,且各分開部署的部分彼此通過各種通訊協(xié)議交互信息,就可算作分布式部署,生產(chǎn)環(huán)境下的微服務(wù)肯定是分布式部署的,分布式部署的應(yīng)用不一定是微服務(wù)架構(gòu)的,比如集群部署,它是把相同應(yīng)用復(fù)制到不同服務(wù)器上,但是邏輯功能上還是單體應(yīng)用。

分布式和微服的架構(gòu)很相似,只是部署的方式不一樣。假設(shè)去大飯店吃飯就是一個(gè)完整的業(yè)務(wù)的話, 飯店的廚師、洗碗阿姨、服務(wù)員就是分布式,特點(diǎn)是各司其職。廚師、洗碗阿姨和服務(wù)員都不止一個(gè)人,這就是集群。分布式就是微服務(wù)的一種表現(xiàn)形式,分布式是部署層面,微服務(wù)是設(shè)計(jì)層面。

為什么要分布式部署?

分布式部署優(yōu)點(diǎn):

  • 高性能

分布式計(jì)算可以把大型計(jì)算分布到多臺(tái)計(jì)算機(jī)上進(jìn)行,它可以根據(jù)不同的任務(wù)和場(chǎng)景來配置不同數(shù)量的計(jì)算資源,滿足所需要的快速響應(yīng)時(shí)間,提供更高的性能。

  • 高可擴(kuò)展性

分布式計(jì)算系統(tǒng)可以根據(jù)需要,增加更多的計(jì)算機(jī)來滿足技術(shù)需求

  • 高可靠性(容錯(cuò)性)

分布式計(jì)算因?yàn)椴捎煤芏嘤?jì)算機(jī)來完成計(jì)算,一臺(tái)服務(wù)器的崩潰并不影響到其余的服務(wù)器,失敗的任務(wù)也會(huì)被調(diào)度到其他服務(wù)器上重新執(zhí)行,不影響總體任務(wù)的完成

分布式部署缺點(diǎn):

  • 故障診斷和調(diào)試

而要定位具體的故障機(jī)器及原因,并進(jìn)行故障調(diào)試就存在著很多的問題。引起故障的原因也是多方面的,可能是網(wǎng)絡(luò)問題、硬件問題、權(quán)限問題、同步問題等,要進(jìn)行問題的重現(xiàn)和跟蹤診斷遠(yuǎn)不如一臺(tái)服務(wù)器或是一個(gè)集中的運(yùn)行環(huán)境來得方便。

  • 網(wǎng)絡(luò)開銷

經(jīng)常會(huì)遇到網(wǎng)絡(luò)基礎(chǔ)設(shè)施的問題,如傳輸問題、網(wǎng)絡(luò)擁堵、信息丟失等,需要在應(yīng)用層面處理所有這些故障,造成比較大的開銷

  • 增加開發(fā)難度

開發(fā)過程中需要考慮到分布式可能帶來的數(shù)據(jù),安全等的問題,需要開發(fā)來解決,增加工作難度。

02

分布式系統(tǒng)挑戰(zhàn)

挑戰(zhàn)

分布式系統(tǒng)需要大量機(jī)器協(xié)作,面臨諸多的挑戰(zhàn):

#1

異構(gòu)的機(jī)器與網(wǎng)絡(luò)。

分布式系統(tǒng)中的機(jī)器,配置不一樣,其上運(yùn)行的服務(wù)也可能由不同的語言、架構(gòu)實(shí)現(xiàn),因此處理能力也不一樣;節(jié)點(diǎn)間通過網(wǎng)絡(luò)連接,而不同網(wǎng)絡(luò)運(yùn)營商提供的網(wǎng)絡(luò)的帶寬、延時(shí)、丟包率又不一樣。怎么保證大家齊頭并進(jìn),共同完成目標(biāo),這四個(gè)不小的挑戰(zhàn)。

普遍的節(jié)點(diǎn)故障。

雖然單個(gè)節(jié)點(diǎn)的故障概率較低,但節(jié)點(diǎn)數(shù)目達(dá)到一定規(guī)模,出故障的概率就變高了。分布式系統(tǒng)需要保證故障發(fā)生的時(shí)候,系統(tǒng)仍然是可用的,這就需要監(jiān)控節(jié)點(diǎn)的狀態(tài),在節(jié)點(diǎn)故障的情況下將該節(jié)點(diǎn)負(fù)責(zé)的計(jì)算、存儲(chǔ)任務(wù)轉(zhuǎn)移到其他節(jié)點(diǎn)。

#2

#3

不可靠的網(wǎng)絡(luò)。

節(jié)點(diǎn)間通過網(wǎng)絡(luò)通信,而網(wǎng)絡(luò)是不可靠的??赡艿木W(wǎng)絡(luò)問題包括:網(wǎng)絡(luò)分割、延時(shí)、丟包、亂序。

相比單機(jī)過程調(diào)用,網(wǎng)絡(luò)通信最讓人頭疼的是超時(shí):節(jié)點(diǎn) A 向節(jié)點(diǎn) B 發(fā)出請(qǐng)求,在約定的時(shí)間內(nèi)沒有收到節(jié)點(diǎn) B 的響應(yīng),那么 B 是否處理了請(qǐng)求,這個(gè)是不確定的,這個(gè)不確定會(huì)帶來諸多問題,最簡(jiǎn)單的,是否要重試請(qǐng)求,節(jié)點(diǎn) B 會(huì)不會(huì)多次處理同一個(gè)請(qǐng)求。

分布式系統(tǒng)CAP+Base

CAP原則又稱CAP定理,指的是在一個(gè)分布式系統(tǒng)中,一致性(Consistency)、可用性(Availability)、分區(qū)容錯(cuò)性(Partition tolerance)。

在分布式系統(tǒng)的設(shè)計(jì)中,沒有一種設(shè)計(jì)可以同時(shí)滿足一致性,可用性,分區(qū)容錯(cuò)性 3個(gè)特性 :

  • 一致性(C):又叫做強(qiáng)一致性,指的是所有節(jié)點(diǎn)在同一時(shí)間的數(shù)據(jù)完全一致。
  • 可用性(A):可用性指服務(wù)一直可用,而且是正常響應(yīng)時(shí)間,不會(huì)出現(xiàn)響應(yīng)錯(cuò)誤。
  • 分區(qū)容忍性(P):分區(qū)容錯(cuò)性指在遇到某節(jié)點(diǎn)或網(wǎng)絡(luò)分區(qū)故障的時(shí)候,仍然能夠?qū)ν馓峁┓?wù),保證整個(gè)系統(tǒng)的運(yùn)行。

為什么在分布式系統(tǒng)的設(shè)計(jì)中,沒有一種設(shè)計(jì)可以同時(shí)滿足一致性,可用性,分區(qū)容錯(cuò)性 3個(gè)特性?

  1. 分布式系統(tǒng)中P是必須要存在的,否則其中一臺(tái)機(jī)器掛掉了,整個(gè)系統(tǒng)都不可使用了。
  2. AP: 高可用,某一時(shí)刻AB之前網(wǎng)絡(luò)出現(xiàn)問題,系統(tǒng)依舊可以對(duì)外提供服務(wù),數(shù)據(jù)可能會(huì)不一致。
  3. CP:強(qiáng)一致性,如果數(shù)據(jù)沒有同步,整個(gè)系統(tǒng)將不能夠?qū)ν馓峁┓?wù),犧牲系統(tǒng)的可用性。

分布式系統(tǒng)CP案例 (保證強(qiáng)一致性zookeeper)

知識(shí)點(diǎn)預(yù)熱(ZooKeeper 集群中的角色簡(jiǎn)介):

  • Leader:負(fù)責(zé)發(fā)起投票和決議,更新系統(tǒng)狀態(tài)。
  • Follower:用于接收客戶端請(qǐng)求并向客戶端返回結(jié)果,在選主過程 中參與投票。
  • Observer:可以接收客戶端連接,將寫請(qǐng)求轉(zhuǎn)發(fā)給 Leader 節(jié)點(diǎn),但不會(huì)參與 Leader 發(fā)起的投票,也不會(huì)被選舉為 Leader,Observer 的目的是為了擴(kuò)展系統(tǒng),提高讀取速度。

當(dāng)Follower發(fā)現(xiàn)Leader節(jié)點(diǎn)掛了之后,F(xiàn)ollower會(huì)拒絕現(xiàn)有的客戶端連接,參與主從選舉,在成功選舉出leader之前,zk將不可用;這個(gè)時(shí)候如果ZK作為注冊(cè)中心,注冊(cè)中心將不可用。

分布式系統(tǒng)AP案例 (保證高可用性)

從上圖中可看出,Eureka注冊(cè)中心采用集群部署,滿足高可用的特性,當(dāng)訂單服務(wù)在擴(kuò)容的時(shí)候,新增訂單服務(wù)實(shí)例4,數(shù)據(jù)注冊(cè)到Eureka A節(jié)點(diǎn),在其余的兩個(gè)節(jié)點(diǎn)沒有訂單服務(wù)4這個(gè)實(shí)例信息。這種情況下,用戶服務(wù)獲取服務(wù)列表,可能獲取不到訂單實(shí)例4,這就是最簡(jiǎn)單的數(shù)據(jù)不一致情況。但是對(duì)于Eureka集群本身,各個(gè)節(jié)點(diǎn)都處于平等的地位,完全是為了冗余,這時(shí)有其中一個(gè)節(jié)點(diǎn)掛掉并不影響Eureka的使用,從這個(gè)角度來說保證了分布式的高可用。

分布式系統(tǒng)BASE理論

BASE 理論中的最終一致性,是指分布式系統(tǒng)中所有的數(shù)據(jù)副本在經(jīng)過一段時(shí)間的同步后,最終都會(huì)達(dá)到一個(gè)一致的狀態(tài)。也就是說,在數(shù)據(jù)副本在達(dá)到一致之前,會(huì)存在一斷延遲。

  • 場(chǎng)景一:比如我們?yōu)g覽淘寶時(shí)商品的評(píng)價(jià),當(dāng)你點(diǎn)贊評(píng)價(jià)之后,我們刷新頁面不一定能馬上看到,類似于這樣的場(chǎng)景都可以是弱一致性,只要我們最終數(shù)據(jù)達(dá)到一致就可以。
  • 場(chǎng)景二:當(dāng)我們發(fā)起請(qǐng)假審批時(shí),請(qǐng)假系系統(tǒng)通過之后,考勤系統(tǒng)需要對(duì)我們的考勤進(jìn)行計(jì)算,但在早高峰時(shí),我們考勤大卡系統(tǒng)并發(fā)比較大,資源比較緊張,可能這個(gè)時(shí)候處理請(qǐng)假的考勤計(jì)算就會(huì)比較慢,但最終會(huì)給你計(jì)算完成。

03

實(shí)戰(zhàn)案例

場(chǎng)景一:websocket實(shí)現(xiàn)分布式方案

問題描述:websocket相關(guān)簡(jiǎn)介

  1. 在Spring所集成的WebSocket里面,每個(gè)ws連接都有一個(gè)對(duì)應(yīng)的session,每臺(tái)服務(wù)器都存有各自的session。
  2. 目前沒websocket session共享的方案,因此走redis websocket session共享這條路是行不通的。
  3. 因此在集群中,我們無法將所有WebSocketSession都緩存到redis進(jìn)行session共享。

業(yè)務(wù)場(chǎng)景:前端發(fā)起流水線執(zhí)行的HTTP請(qǐng)求,點(diǎn)擊執(zhí)行日志與后端建立WS鏈接,后端能夠?qū)崟r(shí)的把日志主動(dòng)推送到前端頁面。

問題描述:websocket分布式會(huì)遇到的問題

當(dāng)后端服務(wù)器有多臺(tái)時(shí),用戶A發(fā)起流水線執(zhí)行的HTTP請(qǐng)求發(fā)送到B服務(wù)器,點(diǎn)擊查看實(shí)時(shí)日志與服務(wù)器A建立WS長鏈接,無法接收到實(shí)時(shí)日志的推送,而B用戶刷新當(dāng)前流水線可以看到實(shí)時(shí)日志。

期待效果:

用戶A發(fā)起流水線執(zhí)行的HTTP請(qǐng)求發(fā)送到B服務(wù)器。用戶A、用戶B點(diǎn)擊實(shí)時(shí)日志查看,均可以查看到流水線執(zhí)行的情況。

解決方案:

用戶A發(fā)起流水線執(zhí)行的HTTP請(qǐng)求發(fā)送到B服務(wù)器。B服務(wù)器把流水線執(zhí)行日志實(shí)時(shí)推送到Redis中,服務(wù)器A和B監(jiān)聽訂閱Redis的日志數(shù)據(jù),一旦監(jiān)聽到數(shù)據(jù),服務(wù)器A、B通過WS長鏈接把日志推送給與當(dāng)前服務(wù)器建立長鏈接的用戶A、用戶B。這樣就起到了解耦的作用,無論用戶的請(qǐng)求發(fā)送到哪一臺(tái)服務(wù)器上,無論用戶的長鏈接是與哪一臺(tái)服務(wù)器建立連接,都可以查看實(shí)時(shí)日志。

場(chǎng)景二:定時(shí)線程池分布式問題

問題描述

在項(xiàng)目中我們經(jīng)常會(huì)使用定時(shí)線程池來實(shí)現(xiàn)一個(gè)定時(shí)的異步任務(wù),線程池的創(chuàng)建和銷毀也是JVM層面的,如果分布式多機(jī)器部署的場(chǎng)景使用到定時(shí)線程池又會(huì)遇到什么問題,又要怎么去解決?

問題一:用戶在A服務(wù)器創(chuàng)建了一個(gè)任務(wù)加入到A服務(wù)器的線程池中,然后用戶B負(fù)載到B服務(wù)器上去取消這個(gè)定時(shí)任務(wù)?無法取消?

思考:是不是可以對(duì)創(chuàng)建的任務(wù)做一個(gè)Hash,有關(guān)某個(gè)任務(wù)的所有的操作都負(fù)載到同一個(gè)服務(wù)器上

結(jié)合問題及思考進(jìn)行如下改造:

問題二:如果突然A服務(wù)器掛了,這時(shí)候A服務(wù)器上面定時(shí)線程池中所存的任務(wù)就會(huì)消失?該怎么辦?

思考:這里和上面websocket場(chǎng)景還不一樣,上面實(shí)時(shí)查看日志,如果服務(wù)器掛掉用戶刷新一下頁面,用戶可以重新負(fù)載到其他服務(wù)器繼續(xù)查看日志。這里我創(chuàng)建完成一個(gè)任務(wù)之后,就完全交給JVM線程池了,服務(wù)器掛掉之后任務(wù)用戶自己創(chuàng)建的任務(wù)就消失了。怎么解決?

結(jié)合問題及思考進(jìn)行如下改造:

方案:我們把任務(wù)放在線程池中,并且緩存在Redis中做緩存?zhèn)浞?,借鑒微服務(wù)注冊(cè)中心的概念,我們把服務(wù)注冊(cè)到注冊(cè)中心,當(dāng)注冊(cè)中心檢測(cè)到B服務(wù)器掛掉了,就通知A服務(wù)器就把掛掉的B服務(wù)器線程池中的任務(wù)同步到A服務(wù)器中同步創(chuàng)建一份繼續(xù)執(zhí)行。

細(xì)節(jié)考慮:如果有一臺(tái)C服務(wù)器掛掉了,A和B同時(shí)監(jiān)聽到,會(huì)不會(huì)A和B分別在本地都創(chuàng)建了B的任務(wù),那同一時(shí)刻A和C分別會(huì)執(zhí)行B的任務(wù),同一時(shí)刻任務(wù)會(huì)執(zhí)行兩遍?

深度思考:分布式帶來了什么問題?系統(tǒng)的復(fù)雜度是不是大大的增加了。維護(hù)起來變得更復(fù)雜了。

案例總結(jié)

  • 以上的兩個(gè)案例都有一個(gè)問題,就是他們的數(shù)據(jù)/或者是執(zhí)行都過度依賴服務(wù)器節(jié)點(diǎn),沒有好的辦法把數(shù)據(jù)抽離出來
  • 分布式部署,需要考慮到服務(wù)器單點(diǎn)故障的問題,如果服務(wù)器掛了,數(shù)據(jù)怎么轉(zhuǎn)移到其他的服務(wù)器繼續(xù)執(zhí)行。
  • 結(jié)合我們的CAP+Base的理論來看,websocket是屬于數(shù)據(jù)不一致的問題。我們引入redis的發(fā)布訂閱使每個(gè)服務(wù)器的數(shù)據(jù)最終達(dá)成一致。
  • 定時(shí)線程池屬于高可用的問題,當(dāng)一個(gè)節(jié)點(diǎn)掛了,其他服務(wù)器的節(jié)點(diǎn)無法感知。我們引入服務(wù)注冊(cè)的概念,由注冊(cè)節(jié)點(diǎn)來對(duì)任務(wù)進(jìn)行調(diào)度。

04

分布式常見方案

分布式事物

本地事物的ACID:

分布式事務(wù),就是指不是在單個(gè)服務(wù)或單個(gè)數(shù)據(jù)庫架構(gòu)下,產(chǎn)生的事務(wù),例如:在數(shù)據(jù)庫水平拆分、服務(wù)垂直拆分之后,一個(gè)業(yè)務(wù)操作通常要跨多個(gè)數(shù)據(jù)庫、服務(wù)才能完成。例如電商行業(yè)中比較常見的下單付款案例,包括下面幾個(gè)行為:

  1. 創(chuàng)建新訂單
  2. 扣減商品庫存
  3. 從用戶賬戶余額扣除金額

完成上面的操作需要訪問三個(gè)不同的微服務(wù)和三個(gè)不同的數(shù)據(jù)庫。訂單的創(chuàng)建、庫存的扣減、賬戶扣款在每一個(gè)服務(wù)和數(shù)據(jù)庫內(nèi)是一個(gè)本地事務(wù),可以保證ACID原則。但是當(dāng)我們把三件事情看做一個(gè)'業(yè)務(wù)',要滿足保證“業(yè)務(wù)”的原子性,要么所有操作全部成功,要么全部失敗,不允許出現(xiàn)部分成功部分失敗的現(xiàn)象,這就是分布式系統(tǒng)下的事務(wù)。

分布式事物解決方案:Seata

Seata事務(wù)管理中有三個(gè)重要的角色:

  • TC (Transaction Coordinator) - **事務(wù)協(xié)調(diào)者:**維護(hù)全局和分支事務(wù)的狀態(tài),協(xié)調(diào)全局事務(wù)提交或回滾。
  • TM (Transaction Manager) - **事務(wù)管理器:**定義全局事務(wù)的范圍、開始全局事務(wù)、提交或回滾全局事務(wù)。
  • RM (Resource Manager) - **資源管理器:**管理分支事務(wù)處理的資源,與TC交談以注冊(cè)分支事務(wù)和報(bào)告分支事務(wù)的狀態(tài),并驅(qū)動(dòng)分支事務(wù)提交或回滾。

分布式鎖

什么情況下需要使用鎖?

  1. 有并發(fā),多線程(這里指的是資源的使用者多,多個(gè)任務(wù)想同時(shí)使用一個(gè)資源才有競(jìng)爭(zhēng)的可能)
  2. 有寫操作(如果是多個(gè)任務(wù)都是讀請(qǐng)求的話,不同任務(wù)來讀取的結(jié)果都是一樣的,也就沒有必要去控制誰先讀誰后讀)
  3. 有競(jìng)爭(zhēng)關(guān)系(這里指的是對(duì)資源的訪問方式是互斥的,我們這個(gè)資源雖然是共享的,同但一時(shí)刻只能有一個(gè)任務(wù)占用它不能同時(shí)共用,這個(gè)時(shí)候我們需要給它上鎖)

在單機(jī)環(huán)境下,也就是單個(gè)JVM環(huán)境下多線程對(duì)共享資源的并發(fā)更新處理,我們可以簡(jiǎn)單地使用JDK提供的ReentrantLock。

如果是在微服務(wù)架構(gòu)多實(shí)例的環(huán)境下,每一個(gè)服務(wù)都有多個(gè)節(jié)點(diǎn),我們?nèi)绻€是按照之前的方式來做,就會(huì)出現(xiàn)如下圖這樣的情況:這個(gè)時(shí)候再用ReentrantLock就沒辦法控制了,因?yàn)檫@時(shí)候這些任務(wù)是跨JVM的,不再是簡(jiǎn)單的單體應(yīng)用了,需要協(xié)同多個(gè)節(jié)點(diǎn)信息,共同獲取鎖的競(jìng)爭(zhēng)情況。

分布式鎖解決方案:Redis

基于數(shù)據(jù)庫實(shí)現(xiàn)的分布式鎖。

實(shí)現(xiàn)邏輯:在數(shù)據(jù)庫中創(chuàng)建一個(gè)表,表中包含方法名、類名等字段,并在方法名字段上創(chuàng)建唯一索引,當(dāng)執(zhí)行某個(gè)方法時(shí),就使用這個(gè)方法名向表中插入數(shù)據(jù),插入成功就相當(dāng)于獲取了鎖,執(zhí)行完成后刪除對(duì)應(yīng)的行數(shù)據(jù)釋放鎖。

但是要注意以下幾點(diǎn)要求:

  • 數(shù)據(jù)庫的可用性和性能將直接影響分布式鎖的可用性及性能。
  • 鎖的可重入性。同一個(gè)線程在釋放鎖之前,數(shù)據(jù)會(huì)一直存在,無法再次成功插入,需要在表中新增一列,用于記錄當(dāng)前獲取到鎖的服務(wù)節(jié)點(diǎn)和線程信息,再次獲取鎖的時(shí)候,先查詢數(shù)據(jù)庫表中服務(wù)節(jié)點(diǎn)和線程信息是否和當(dāng)前服務(wù)節(jié)點(diǎn)和線程信息相同,若相同則直接獲取鎖。
  • 鎖的阻塞性。當(dāng)獲取不到鎖,需要循環(huán)多次去獲取。并設(shè)置一個(gè)超時(shí)時(shí)間,如果超過這個(gè)時(shí)間還沒有獲取到鎖,則返回失敗。

基于redis實(shí)現(xiàn)的分布式鎖。

實(shí)現(xiàn)邏輯:獲取鎖的時(shí)候,使用setnx加鎖,并使用expire命令為鎖添加一個(gè)超時(shí)時(shí)間,超過該時(shí)間則自動(dòng)釋放鎖,鎖的value值為一個(gè)隨機(jī)生成的UUID,通過此在釋放鎖的時(shí)候進(jìn)行判斷。獲取鎖的時(shí)候還設(shè)置一個(gè)獲取的超時(shí)時(shí)間,若超過這個(gè)時(shí)間則放棄獲取鎖。

Redission基于redis實(shí)現(xiàn)的分布式鎖RedLock。

Redission是基于redis實(shí)現(xiàn)的用于解決分布式問題的框架,其中RedLock是用來解決分布式鎖的常見方案。使用也比較簡(jiǎn)單。

分布式ID

分布式 ID 是分布式系統(tǒng)下的 ID。例如:?jiǎn)螜C(jī) MySQL 需要進(jìn)行分庫分表。在分庫之后, 數(shù)據(jù)遍布在不同服務(wù)器上的數(shù)據(jù)庫,數(shù)據(jù)庫的自增主鍵已經(jīng)沒辦法滿足生成的主鍵唯一了。分布式ID就是為不同的數(shù)據(jù)節(jié)點(diǎn)生成全局唯一主鍵ID。

分布式 ID 需要滿足哪些要求?

  • 全局唯一 :ID 的全局唯一性肯定是首先要滿足的!
  • 高性能 :分布式 ID 的生成速度要快,對(duì)本地資源消耗要小。
  • 高可用 :生成分布式 ID 的服務(wù)要保證可用性無限接近于 100%。
  • 方便易用 :拿來即用,使用方便,快速接入

分布式 ID 常見的方案

方案一:Redis的Incr

NoSQL 方案使用 Redis 多一些。我們通過 Redis 的 incr 命令即可實(shí)現(xiàn)對(duì) id 原子順序遞增。

  • 優(yōu)點(diǎn):性能不錯(cuò)并且生成的 ID 是有序遞增的。
  • 缺點(diǎn):存在數(shù)據(jù)庫單點(diǎn)問題(可以使用數(shù)據(jù)庫集群解決,不過增加了復(fù)雜度)。

方案二:UUID

UUID 可以保證唯一性,因?yàn)槠渖梢?guī)則包括 MAC 地址、時(shí)間戳、名字空間(Namespace)、隨機(jī)或偽隨機(jī)數(shù)、時(shí)序等元素,計(jì)算機(jī)基于這些規(guī)則生成的 UUID 是肯定不會(huì)重復(fù)的。

  • 優(yōu)點(diǎn):生成速度比較快、簡(jiǎn)單易用
  • 缺點(diǎn):比如使用 UUID 作為 MySQL 數(shù)據(jù)庫主鍵的時(shí)候就非常不合適:數(shù)據(jù)庫主鍵要盡量越短越好,而 UUID 的消耗的存儲(chǔ)空間比較大(32 個(gè)字符串,128 位)。UUID 是無順序的,InnoDB 引擎下,數(shù)據(jù)庫主鍵的無序性會(huì)嚴(yán)重影響數(shù)據(jù)庫性能。(UUID當(dāng)機(jī)器時(shí)間不對(duì)的情況下,可能導(dǎo)致會(huì)產(chǎn)生重復(fù) ID)

方案三:雪花算法

Snowflake 是 Twitter 開源的分布式 ID 生成算法。Snowflake 由 64 bit 的二進(jìn)制數(shù)字組成,這 64bit 的二進(jìn)制被分成了幾部分,每一部分存儲(chǔ)的數(shù)據(jù)都有特定的含義:

  • 第 0 位:符號(hào)位(標(biāo)識(shí)正負(fù)),始終為 0,沒有用,不用管。
  • 第 1~41 位 :一共 41 位,用來表示時(shí)間戳,單位是毫秒,可以支撐 2 ^41 毫秒(約 69 年)
  • 第 42~52 位 :一共 10 位,一般來說,前 5 位表示機(jī)房 ID,后 5 位表示機(jī)器 ID(實(shí)際項(xiàng)目中可以根據(jù)實(shí)際情況調(diào)整)。這樣就可以區(qū)分不同集群/機(jī)房的節(jié)點(diǎn)。
  • 第 53~64 位 :一共 12 位,用來表示序列號(hào)。序列號(hào)為自增值,代表單臺(tái)機(jī)器每毫秒能夠產(chǎn)生的最大 ID 數(shù)(2^12 = 4096),也就是說單臺(tái)機(jī)器每毫秒最多可以生成 4096 個(gè) 唯一 ID。
  • 優(yōu)點(diǎn) :生成速度比較快、生成的 ID 有序遞增、比較靈活(可以對(duì) Snowflake 算法進(jìn)行簡(jiǎn)單的改造比如加入業(yè)務(wù) ID)
  • 缺點(diǎn) :需要解決重復(fù) ID 問題(依賴時(shí)間,當(dāng)機(jī)器時(shí)間不對(duì)的情況下,可能導(dǎo)致會(huì)產(chǎn)生重復(fù) ID)。

分布式調(diào)度

分布式調(diào)度定義(分布式任務(wù)調(diào)度有兩層含義):

  • 運(yùn)行在分布式集群環(huán)境下的調(diào)度任務(wù)(同一個(gè)定時(shí)任務(wù)部署多分,只應(yīng)該有一個(gè)定時(shí)任務(wù)在執(zhí)行)
  • 分布式調(diào)度–> 定時(shí)任務(wù)的分布式 --> 定時(shí)任務(wù)的拆分 (把一個(gè)大的作業(yè)任務(wù)拆分為多個(gè)小的作業(yè))

分布式方案一:Elastic-Job

Elastic_Job 是當(dāng)當(dāng)網(wǎng)開源的一個(gè)分布式調(diào)度解決方案,基于 Quartz 二次開發(fā)的,功能非常豐富強(qiáng)大,采用 zookeeper 實(shí)現(xiàn)分布式調(diào)度,實(shí)現(xiàn)任務(wù)分片以及高可用。目前由兩個(gè)相互獨(dú)立的子項(xiàng)目 Elatstic-Job-Lite 和 Elastic-Job-Cloud 組成。目前說的是 Elastic-Job-Lite 的輕量級(jí)解決方案,使用 jar 的形式提供分布式任務(wù)的調(diào)度服務(wù),而 Elastic-Job-Cloud 是結(jié)合 Mesos 以及 Docker 在云環(huán)境下使用。

分布式調(diào)度方案二:XXL-JOB

XXL-JOB是一個(gè)輕量級(jí)分布式任務(wù)調(diào)度平臺(tái),有以下特性:

  • 簡(jiǎn)單:支持通過Web頁面對(duì)任務(wù)進(jìn)行CRUD操作,操作簡(jiǎn)單,一分鐘上手;
  • 動(dòng)態(tài):支持動(dòng)態(tài)修改任務(wù)狀態(tài)、啟動(dòng)/停止任務(wù),以及終止運(yùn)行中任務(wù),即時(shí)生效
  • 注冊(cè)中心: 執(zhí)行器會(huì)周期性自動(dòng)注冊(cè)任務(wù), 調(diào)度中心將會(huì)自動(dòng)發(fā)現(xiàn)注冊(cè)的任務(wù)并觸發(fā)執(zhí)行,每30秒清理一次注冊(cè)表中的無效機(jī)器。同時(shí),也支持手動(dòng)錄入執(zhí)行器地址;
  • 失敗處理策略:每10秒檢測(cè)失敗任務(wù),報(bào)警和重試;
  • 一致性:“調(diào)度中心”通過DB鎖保證集群分布式調(diào)度的一致性, 一次任務(wù)調(diào)度只會(huì)觸發(fā)一次執(zhí)行

最后,工具推薦Redisson,是架設(shè)在Redis基礎(chǔ)上的一個(gè)Java駐內(nèi)存數(shù)據(jù)網(wǎng)格(In-Memory Data Grid)。充分的利用了Redis鍵值數(shù)據(jù)庫提供的一系列優(yōu)勢(shì),基于Java實(shí)用工具包中常用接口,為使用者提供了一系列具有分布式特性的常用工具類。使得原本作為協(xié)調(diào)單機(jī)多線程并發(fā)程序的工具包獲得了協(xié)調(diào)分布式多機(jī)多線程并發(fā)系統(tǒng)的能力,大大降低了設(shè)計(jì)和研發(fā)大規(guī)模分布式系統(tǒng)的難度。同時(shí)結(jié)合各富特色的分布式服務(wù),更進(jìn)一步簡(jiǎn)化了分布式環(huán)境中程序相互之間的協(xié)作。

https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
詳解應(yīng)對(duì)平臺(tái)高并發(fā)的分布式調(diào)度框架TBSchedule
淺談分布式鎖與樂觀鎖
關(guān)于分布式系統(tǒng)復(fù)習(xí)題與參考答案
圖解什么是一致性哈希算法
分布式與集群的區(qū)別是什么?
直播系統(tǒng)代碼,分布式怎么做到任務(wù)的一致性
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服