更新時(shí)間:2020-04-28 12:47:11 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2165次
1.服務(wù)接口的冪等設(shè)計(jì)
冪等:每次請(qǐng)求重復(fù)調(diào)用的結(jié)果都是一樣的。
分布式服務(wù)中的提交接口一般都需要進(jìn)行冪等校驗(yàn)。例如做支付接口,如果一筆支付在網(wǎng)絡(luò)異常時(shí)進(jìn)行兩次,或者更多次調(diào)用。沒(méi)有控制冪等的設(shè)計(jì),那么可能會(huì)導(dǎo)致進(jìn)行多次支付,而系統(tǒng)中只有一筆訂單,造成的影響不言而喻。
冪等性一般可以用一個(gè)請(qǐng)求號(hào)和請(qǐng)求來(lái)源來(lái)記錄,將請(qǐng)求號(hào)和請(qǐng)求來(lái)源存入redis里面,如果有重復(fù)的過(guò)來(lái),就直接拒絕,也可以針對(duì)請(qǐng)求和請(qǐng)求來(lái)源做唯一索引,這樣帶有重復(fù)數(shù)據(jù)提交過(guò)來(lái)的時(shí)候就會(huì)落庫(kù)失敗。
當(dāng)然也可能會(huì)有不同的請(qǐng)求號(hào)的重復(fù)提交,比如用戶第1次申請(qǐng)的時(shí)候,卡住了,然后用戶返回之后可以點(diǎn)擊第2次申請(qǐng),這樣就會(huì)導(dǎo)致重復(fù)點(diǎn)擊了兩次支付。這樣一般的做法就是添加一個(gè)樂(lè)觀鎖機(jī)制,根據(jù)用戶這一筆錢的支付狀態(tài),或者是用戶的版本來(lái)進(jìn)行比對(duì),如果比對(duì)失敗,說(shuō)明可能是重復(fù)的支付,那么就直接拒絕掉。
2.mq分布式系統(tǒng)的應(yīng)用,以及mq消息不丟失的設(shè)計(jì)
mq一般用來(lái)作為分布式系統(tǒng)的解耦合調(diào)用,系統(tǒng)的削峰填谷(入隊(duì)隊(duì)列滿之后,拒絕新的事件入隊(duì),也可以適當(dāng)避免系統(tǒng)低峰時(shí)間請(qǐng)求數(shù)量太少了而導(dǎo)致的系統(tǒng)資源浪費(fèi)),系統(tǒng)的消息分發(fā),做延遲隊(duì)列來(lái)處理一些定時(shí)的任務(wù)等。
mq的類型也是多種多樣,如何選型也是比較關(guān)鍵的因素。例如最近很火的kafka,因?yàn)樗母咄掏铝浚憧截惪焖俪志没⒅Q;rabbitmq,以它對(duì)多種消息傳輸協(xié)議,支持靈活的消息路由,負(fù)載均衡策略和保證消息不丟失的策略而廣受企業(yè)追捧;activemq,以它支持多種語(yǔ)言客戶端,能夠?qū)崿F(xiàn)多種高級(jí)應(yīng)用聞名;rocketmq,能夠支持大量的消息堆積,精準(zhǔn)控制消息順序,消息過(guò)濾等多種功能......不同的mq應(yīng)用場(chǎng)景也不一樣,諸君需要根據(jù)系統(tǒng)屬性來(lái)合理選擇。
mq中如何確保消息不丟失?以rabbitmq為例。如果是生產(chǎn)者丟失消息,沒(méi)有正確的發(fā)送到mq中。為了確保消息不丟失,mq生產(chǎn)者發(fā)送的時(shí)候要設(shè)置持久化參數(shù),那么mq接收到生產(chǎn)者傳送過(guò)來(lái)的消息時(shí),會(huì)首先把mq消息,持久化到磁盤,持久化完成之后才會(huì)返回,給生產(chǎn)者一個(gè)ack,生產(chǎn)者收到這個(gè)ack之后,說(shuō)明消息已經(jīng)成功傳輸?shù)絤q上,否則生產(chǎn)者將會(huì)重復(fù)傳送這一條消息。消息傳到mq上以后,還要確保消息能夠成功的發(fā)送給消費(fèi)者,且消費(fèi)者能夠成功的處理完消息,因此可以設(shè)置消費(fèi)者處理消息完成之后,再返回ack到mq,mq收到消費(fèi)者回傳的ack之后才會(huì)將消息移出隊(duì)列,否則則會(huì)重復(fù)發(fā)送。
3.redis分布式系統(tǒng)應(yīng)用
數(shù)據(jù)緩存(通過(guò)redis緩存的數(shù)據(jù)可以更快的進(jìn)行訪問(wèn),保證db不會(huì)因?yàn)閴毫μ蟪霈F(xiàn)異常,同時(shí)可以增強(qiáng)系統(tǒng)吞吐量,但是需要準(zhǔn)確的控制緩存數(shù)據(jù)與db數(shù)據(jù)之間的一致性,否則可能會(huì)造成臟讀。如何保證緩存命中率是個(gè)比較復(fù)雜的事情,需要根據(jù)系統(tǒng)屬性來(lái)對(duì)緩存屬性進(jìn)行設(shè)計(jì),同時(shí)也要兼顧到緩存穿透一類的問(wèn)題)。
分布式鎖(使用redis的setnx函數(shù),利用此函數(shù)的原子特性,將需要鎖的對(duì)象唯一性的一些字段添入其中,設(shè)置過(guò)期時(shí)間。其他線程過(guò)來(lái),發(fā)現(xiàn)對(duì)象被鎖之后,采用自旋的方式重復(fù)獲取對(duì)象一段時(shí)間,如果占用對(duì)象的線程釋放對(duì)象之后便可以獲取到對(duì)象鎖,否則直接拋出失敗)。
分布式冪等性接口(同樣使用setnx函數(shù)的特性,根據(jù)來(lái)源傳輸?shù)奈ㄒ恍哉?qǐng)求號(hào)來(lái)進(jìn)行加鎖)。
處理隊(duì)列(類似于用redis來(lái)實(shí)現(xiàn)一個(gè)mq隊(duì)列的功能,不過(guò)沒(méi)有mq那么完全的一個(gè)保證消息不丟失的機(jī)制,需要衡量利弊使用)。
bitmap(用來(lái)記錄一些大數(shù)據(jù)位的數(shù)據(jù)結(jié)構(gòu),可以用來(lái)做布隆過(guò)濾器,進(jìn)行緩存條件的過(guò)濾,可以防止緩存穿透,緩存擊穿)。
4.線程及線程池的使用,種類,以及線程池的設(shè)計(jì)
放一張線程狀態(tài)轉(zhuǎn)換圖(清晰明了,相信不用我多做解釋):
線程池可以分為四大類(Executors工具類),單例線程池(顧名思義,是初始化核心線程和最大線程數(shù)只有一的線程池,一般用來(lái)對(duì)線程進(jìn)入的先后順序進(jìn)行依次執(zhí)行。),固定線程池(固定的核心線程數(shù)和最大線程數(shù),可以根據(jù)機(jī)器的核載量來(lái)決定線程池的大小),緩存線程池(初始化核心線程數(shù)為0,阻塞隊(duì)列為同步的,且最大線程數(shù)不做限制的一個(gè)線程。這類線程時(shí)可以根據(jù)具體請(qǐng)求來(lái)決定線程池?cái)?shù)量的大小,收放自如,但是不做最大線程數(shù)的限制,但是可能會(huì)引起機(jī)器壓力過(guò)大線程數(shù)過(guò)多等問(wèn)題),定時(shí)任務(wù)線程池(創(chuàng)建一個(gè)定長(zhǎng)的,可以按周期定時(shí)執(zhí)行的線程池)
線程池初始化的幾個(gè)參數(shù):如果選擇用自定義線程池ThreadPoolExecutor來(lái)初始化線程池(這種方式也是阿里推薦使用的,直接用Executors工具類可能會(huì)導(dǎo)致),需要注意的幾個(gè)參數(shù)(核心線程數(shù),最大線程數(shù),隊(duì)列選型,拒絕策略)。隊(duì)列類型:ArrayBlockingQueue,PriorityBlockingQueue:有界隊(duì)列,隊(duì)列滿時(shí)會(huì)創(chuàng)建新線程直到最大線程數(shù),隊(duì)列滿時(shí)按照拒絕策略返回;LinkedBlockingQueue:無(wú)界隊(duì)列,隊(duì)列不限制大小,不過(guò)需要注意如果隊(duì)列一直增加會(huì)導(dǎo)致oom;SynchronousQueue:同步隊(duì)列,一般用于cache類型的線程池;拒絕策略:AbortPolicy:丟棄任務(wù)并拋出RejectedExecutionException異常。DiscardPolicy:也是丟棄任務(wù),但是不拋出異常。DiscardOldestPolicy:丟棄隊(duì)列最前面的任務(wù),然后重新嘗試執(zhí)行任務(wù)。CallerRunsPolicy:由調(diào)用線程處理該任務(wù)。
以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java基礎(chǔ)學(xué)習(xí):Java并發(fā)程序設(shè)計(jì)教程”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)