




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
-9-微服務(wù)架構(gòu)的四大殺手锏在分布式系統(tǒng)設(shè)計(jì)中冪等性設(shè)計(jì)中非常重要的,尤其在簡(jiǎn)單的微服務(wù)中一套系統(tǒng)中包含了多個(gè)子系統(tǒng)服務(wù),而一個(gè)子系統(tǒng)服務(wù)往往會(huì)去調(diào)用另一個(gè)服務(wù),而服務(wù)調(diào)用服務(wù)無(wú)非就是使用RPC通信或者restful,分布式系統(tǒng)中的網(wǎng)絡(luò)延時(shí)或中斷是避開(kāi)不了的,通常會(huì)導(dǎo)致服務(wù)的調(diào)用層觸發(fā)重試。
概述
互聯(lián)網(wǎng)應(yīng)用進(jìn)展到今日,從單體應(yīng)用架構(gòu)到SOA以及今日的微服務(wù),隨著微服務(wù)化的不斷升級(jí)進(jìn)化,服務(wù)和服務(wù)之間的穩(wěn)定性變得越來(lái)越重要,分布式系統(tǒng)之所以簡(jiǎn)單,主要緣由是分布式系統(tǒng)需要考慮到網(wǎng)絡(luò)的延時(shí)和不行靠,微服務(wù)很重要的一個(gè)特質(zhì)就是需要保證服務(wù)冪等,保證冪等性很重要的前提需要分布式鎖掌握并發(fā),同時(shí)緩存、降級(jí)和限流是愛(ài)護(hù)微服務(wù)系統(tǒng)運(yùn)行穩(wěn)定性的三大利器。
隨著業(yè)務(wù)不斷的進(jìn)展,按業(yè)務(wù)域的劃分子系統(tǒng)越來(lái)越多,每個(gè)業(yè)務(wù)系統(tǒng)都需要緩存、限流、分布式鎖、冪等工具組件,distributed-tools組件(暫未開(kāi)源)正式包含了上述分布式系統(tǒng)所需要的基礎(chǔ)功能組件。distributed-tools組件基于tair、redis分別供應(yīng)了2個(gè)springbootstarter,使用起來(lái)特別簡(jiǎn)潔。以使用緩存使用redis為例,perties添加如下配置:
接下來(lái)的篇幅,重點(diǎn)會(huì)介紹一下緩存、限流、分布式鎖、冪等的使用方式。
緩存
緩存的使用可以說(shuō)無(wú)處不在,從應(yīng)用懇求的訪問(wèn)路徑來(lái)看,用戶user-掃瞄器緩存-反向代理緩存-WEB服務(wù)器緩存-應(yīng)用程序緩存-數(shù)據(jù)庫(kù)緩存等,幾乎每條鏈路都充斥著緩存的使用,緩存最直白的解釋就是"用空間換時(shí)間'的算法。緩存就是把一些數(shù)據(jù)臨時(shí)存放于某些地方,可能是內(nèi)存,也有可能硬盤(pán)。
總之,目的就是為了避開(kāi)某些耗時(shí)的操作。我們常見(jiàn)的耗時(shí)的操作,比如數(shù)據(jù)庫(kù)的查詢、一些數(shù)據(jù)的計(jì)算結(jié)果,或者是為了減輕服務(wù)器的壓力。其實(shí)減輕壓力也是因查詢或計(jì)算,雖然短耗時(shí),但操作很頻繁,累加起來(lái)也很長(zhǎng),造成嚴(yán)峻排隊(duì)等狀況,服務(wù)器抗不住。distributed-tools組件供應(yīng)了一個(gè)CacheEngine接口,基于Tair、Redis分別有不同的實(shí)現(xiàn),詳細(xì)CacheEngine定義如下:
get方法針對(duì)key進(jìn)行查詢,put存儲(chǔ)緩存數(shù)據(jù),invalid刪除緩存數(shù)據(jù)。
限流
在分布式系統(tǒng)中,尤其面對(duì)一些秒殺、瞬時(shí)高并發(fā)場(chǎng)景,都需要進(jìn)行一些限流措施,保證系統(tǒng)的高可用。通常來(lái)說(shuō)限流的目的是通過(guò)對(duì)并發(fā)訪問(wèn)/懇求進(jìn)行限速,或者一個(gè)時(shí)間窗口內(nèi)的的懇求進(jìn)行限速來(lái)愛(ài)護(hù)系統(tǒng),一旦達(dá)到限制速率則可以拒絕服務(wù)(定向到錯(cuò)誤頁(yè)或告知資源沒(méi)有了)、排隊(duì)或等待(比如秒殺、評(píng)論、下單)、降級(jí)(返回托底數(shù)據(jù)或默認(rèn)數(shù)據(jù),如商品詳情頁(yè)庫(kù)存默認(rèn)有貨)。常見(jiàn)的一些限流算法包括固定窗口、滑動(dòng)窗口、漏桶、令牌桶,
distributed-tools組件目前基于計(jì)數(shù)器只實(shí)現(xiàn)了固定窗口算法,詳細(xì)使用方式如下:
基于CacheEngine的rateLimit方法可以實(shí)現(xiàn)限流,expireTime只能設(shè)定固定窗口時(shí)間,非滑動(dòng)窗口時(shí)間。
另外distributed-tools組件供應(yīng)了模板RateLimitTemplate可以簡(jiǎn)化限流的易用性,可以直接調(diào)用RateLimitTemplate的execute方法處理限流問(wèn)題。
另外distributed-tools組件還供應(yīng)了注解@RateLimit的使用方式,詳細(xì)注解RateLimit定義如下:
基于注解的方式限流使用代碼如下:
任何方法添加上述注解具備了肯定的限流力量(詳細(xì)方法需要在springaop指定攔截范圍內(nèi)),如上代碼表示以參數(shù)key作為限流key,每2分鐘懇求次數(shù)不超過(guò)5次,超過(guò)限制后堵塞3分鐘。
分布式鎖
在Java單一進(jìn)程中通過(guò)synchronized關(guān)鍵字和ReentrantLock可重入鎖可以實(shí)現(xiàn)在多線程環(huán)境中掌握對(duì)資源的并發(fā)訪問(wèn),通常本地的加鎖往往不能滿意我們的需要,我們更多的面對(duì)場(chǎng)景是分布式系統(tǒng)跨進(jìn)程的鎖,簡(jiǎn)稱為分布式鎖。分布式鎖實(shí)現(xiàn)手段通常是將鎖標(biāo)記存在內(nèi)存中,只是該內(nèi)存不是某個(gè)進(jìn)程安排的內(nèi)存而是公共內(nèi)存如Redis、Tair,至于利用數(shù)據(jù)庫(kù)、文件等做鎖與單機(jī)的實(shí)現(xiàn)是一樣的,只要保證標(biāo)記能互斥就行。分布式鎖相對(duì)單機(jī)進(jìn)程的鎖之所以簡(jiǎn)單,主要緣由是分布式系統(tǒng)需要考慮到網(wǎng)絡(luò)的延時(shí)和不行靠。distributed-tools組件供應(yīng)的分布式鎖要具備如下特性:
互斥性:同本地鎖一樣具有互斥性,但是分布式鎖需要保證在不同節(jié)點(diǎn)進(jìn)程的不同線程的互斥。
可重入性:同一個(gè)節(jié)點(diǎn)上的同一個(gè)線程假如獵取了鎖之后那么也可以再次獵取這個(gè)鎖。
鎖超時(shí):和本地鎖一樣支持鎖超時(shí),防止死鎖,通過(guò)異步心跳demon線程刷新過(guò)期時(shí)間,防止特別場(chǎng)景(如FGC死鎖超時(shí))下死鎖。
高性能、高可用:加鎖和解鎖需要高性能,同時(shí)也需要保證高可用防止分布式鎖失效,可以增加降級(jí)。
支持堵塞和非堵塞:同ReentrantLock一樣支持lock和trylock以及tryLock(longtimeOut)。
公正鎖和非公正鎖(不支持):公正鎖是根據(jù)懇求加鎖的挨次獲得鎖,非公正鎖就相反是無(wú)序的,目前distributed-tools組件供應(yīng)的分布式鎖不支持該特性。
distributed-tools組件供應(yīng)的分布式鎖,使用起來(lái)特別簡(jiǎn)潔,供應(yīng)了一個(gè)分布式鎖模板:DistributedLockTemplate,可以直接調(diào)用模板供應(yīng)的靜態(tài)方法(如下):
冪等
在分布式系統(tǒng)設(shè)計(jì)中冪等性設(shè)計(jì)中非常重要的,尤其在簡(jiǎn)單的微服務(wù)中一套系統(tǒng)中包含了多個(gè)子系統(tǒng)服務(wù),而一個(gè)子系統(tǒng)服務(wù)往往會(huì)去調(diào)用另一個(gè)服務(wù),而服務(wù)調(diào)用服務(wù)無(wú)非就是使用RPC通信或者restful,分布式系統(tǒng)中的網(wǎng)絡(luò)延時(shí)或中斷是避開(kāi)不了的,通常會(huì)導(dǎo)致服務(wù)的調(diào)用層觸發(fā)重試。具有這一性質(zhì)的接口在設(shè)計(jì)時(shí)總是秉持這樣的一種理念:調(diào)用接口發(fā)生特別并且重復(fù)嘗試時(shí),總是會(huì)造成系統(tǒng)所無(wú)法承受的損失,所以必需阻擋這種現(xiàn)象的發(fā)生。冪等通常會(huì)有兩個(gè)維度:
1.空間維度上的冪等,即冪等對(duì)象的范圍,是個(gè)人還是機(jī)構(gòu),是某一次交易還是某種類(lèi)型的交易。
2.時(shí)間維度上的冪等,即冪等的保證時(shí)間,是幾個(gè)小時(shí)、幾天還是永久性的。在實(shí)際系統(tǒng)中有許多操作,不管操作多少次,都應(yīng)當(dāng)產(chǎn)生一樣的效果或返回相同的結(jié)果。以下這些應(yīng)用場(chǎng)景也是通常比較常見(jiàn)的應(yīng)用場(chǎng)景:
1.前端重復(fù)提交懇求,且懇求數(shù)據(jù)相同時(shí),后臺(tái)需要返回對(duì)應(yīng)這個(gè)懇求的相同結(jié)果。
2.發(fā)起一次支付懇求,支付中心應(yīng)當(dāng)只扣用戶賬戶一次錢(qián),當(dāng)遇到網(wǎng)絡(luò)中斷或系統(tǒng)特別時(shí),也應(yīng)當(dāng)只扣一次錢(qián)。
3.發(fā)送消息,同樣內(nèi)容的短信發(fā)給用戶只發(fā)一次。
4.創(chuàng)建業(yè)務(wù)訂單,一次業(yè)務(wù)懇求只能創(chuàng)建一個(gè),重試懇求創(chuàng)建多個(gè)就會(huì)出大問(wèn)題。
5.基于msgId的消息冪等處理。在正式使用distributed-tools組件供應(yīng)的冪等之前,我們先看下distributed-tools冪等組件的設(shè)計(jì)。
冪等key提取力量:獵取唯一冪等key
冪等key的提取支持2中注解:IdempotentTxId、IdempotentTxIdGetter,任意方法添加以上2注解,即可提取到相關(guān)冪等key,前提條件是需要將Idempotent注解添加相關(guān)需要冪等的方法上。假如單純使用冪等模板進(jìn)行業(yè)務(wù)處理,需要自己設(shè)置相關(guān)冪等key,且要保證其唯一性。
分布式鎖服務(wù)力量:供應(yīng)全局加鎖、解鎖的力量
distributed-tools冪等組件需要使用自身供應(yīng)的分布式鎖功能,保證其并發(fā)唯一性,distributed-tools供應(yīng)的分布式鎖能夠供應(yīng)其牢靠、穩(wěn)定的加鎖、解鎖力量。
高性能的寫(xiě)入、查詢力量:針對(duì)冪等結(jié)果查詢與存儲(chǔ)
distributed-tools冪等組件供應(yīng)了基于tair、redis的存儲(chǔ)實(shí)現(xiàn),同時(shí)支持自定義一級(jí)、二級(jí)存儲(chǔ)通過(guò)spring依靠注入到IdempotentService,建議distributed-tools冪等存儲(chǔ)結(jié)果一級(jí)存儲(chǔ)tairmdb,二級(jí)存儲(chǔ)ldb或者tablestore,一級(jí)存儲(chǔ)保證其高性能,二級(jí)存儲(chǔ)保證其牢靠性。二級(jí)存儲(chǔ)并行查詢會(huì)返回查詢最快的冪等結(jié)果。
二級(jí)存儲(chǔ)并行異步寫(xiě)入,進(jìn)一步提高性能。高可用的冪等寫(xiě)入、查詢力量:冪等存儲(chǔ)消失特別,不影響業(yè)務(wù)正常流程,增加容錯(cuò)
distributed-tools冪等組件支持二級(jí)存儲(chǔ),為了保證其高可用,究竟二級(jí)存儲(chǔ)消失故障的概率太低,不會(huì)導(dǎo)致業(yè)務(wù)上不行用,假如二級(jí)存儲(chǔ)同時(shí)消失故障,業(yè)務(wù)上做了肯定的容錯(cuò),針對(duì)不確定性的特別實(shí)行重試策略,會(huì)執(zhí)行詳細(xì)冪等方法。一級(jí)存儲(chǔ)與二級(jí)存儲(chǔ)的寫(xiě)入與查詢處理進(jìn)行隔離,任何一級(jí)存儲(chǔ)的特別不會(huì)影響整體業(yè)務(wù)執(zhí)行。在了解了distributed-tools組件冪等之后,接下來(lái)我們來(lái)看下如何去使用冪等組件,首先了解下common-api供應(yīng)的冪等注解,詳細(xì)冪等注解使用方式如下:
冪等攔截器獵取冪等ID的優(yōu)先級(jí):
首先推斷Idempotent的spelKey的屬性是否為空,假如不為空會(huì)依據(jù)spelKey定義的spring表達(dá)式生成冪等ID。
其次推斷參數(shù)是否包含IdempotentTxId注解,假如有IdempotentTxId,會(huì)直接獵取參數(shù)值生成冪等ID。
再次通過(guò)反射獵取參數(shù)對(duì)象屬性是否包含IdempotentTxId注解,假如對(duì)象屬性包含IdempotentTxId注解會(huì)獵取該參數(shù)對(duì)象屬性生成冪等ID。
最終以上三種狀況仍未獵取到冪等ID,會(huì)進(jìn)一步通過(guò)反射獵取參數(shù)對(duì)象的Method是否定義IdempotentTxIdGetter注解,假如包含該注解則通過(guò)反射生成冪等ID。
代碼使用示例:
如上述代碼表示從request獵取requestId作為冪等key,一級(jí)存儲(chǔ)有效期7天,二級(jí)存儲(chǔ)有效期30天。distributed-tools除了可以使用冪等注解外,冪等組件還供應(yīng)了一個(gè)通用冪等模板IdempotentTemplate,使用冪等模板的前提必需設(shè)置tair.idempotent.enabled=true或者redis.idempotent.enabled=true,默認(rèn)為false,同時(shí)需要指定冪等結(jié)果一級(jí)存儲(chǔ),冪等結(jié)果存儲(chǔ)為可選項(xiàng)配置。詳細(xì)使用冪等模板IdempotentTemplate的方法如下:
request:
冪等參數(shù)IdempotentRequest組裝,可以設(shè)置冪等參數(shù)和冪等唯一ID。
executeSupplier:
詳細(xì)冪等的方法規(guī)律,比如針對(duì)支付、下單接口,可以通過(guò)JDK8函數(shù)式接口SupplierCallback進(jìn)行處理。
resultBiConsumer:
冪等返回結(jié)果的處理,該參數(shù)可
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 合股開(kāi)餐廳合同范本
- 衛(wèi)生清潔合同范本
- 勞務(wù)派遣合同范本2003
- 個(gè)人供貨客戶合同范本
- 合股認(rèn)購(gòu)合同范本
- 合伙協(xié)議書(shū)范本合同范本
- 叉車(chē)工聘用合同范本
- 員工合同范例送水
- 傳單兼職人員合同范本
- 劇組財(cái)務(wù)合同范本
- 婦產(chǎn)科學(xué)(甲)知到智慧樹(shù)章節(jié)測(cè)試課后答案2024年秋浙江大學(xué)
- 《抗菌藥物合理運(yùn)用》課件
- 大學(xué)生創(chuàng)新創(chuàng)業(yè)基礎(chǔ)教程(高職“創(chuàng)新創(chuàng)業(yè)”課程)全套教學(xué)課件
- 學(xué)習(xí)弘揚(yáng)雷鋒精神課件
- 霍尼韋爾DDC編程軟件(CARE)簡(jiǎn)介
- 實(shí)用中西醫(yī)結(jié)合診斷治療學(xué)
- 論《說(shuō)文解字》中的水文化
- 幕墻工程技術(shù)標(biāo)范本
- 德龍自卸車(chē)合格證掃描件(原圖)
- [國(guó)家公務(wù)員考試密押題庫(kù)]申論模擬925
- 初級(jí)電工教學(xué)大綱與教學(xué)計(jì)劃
評(píng)論
0/150
提交評(píng)論