柚子快報(bào)激活碼778899分享:分布式相關(guān)應(yīng)用V-1.0.0
柚子快報(bào)激活碼778899分享:分布式相關(guān)應(yīng)用V-1.0.0
這里寫自定義目錄標(biāo)題
分布式&中間件什么是分布式分布式理論
中間件消息中間件消息中間件的組成消息中間件的發(fā)布模式消息中間件的作用消息中間件的應(yīng)用場(chǎng)景思考:消息中間件掛了,怎樣保證消息發(fā)送成功。怎樣保證一定是消費(fèi)成功?怎樣保證消息不回丟失?如果停電了怎么辦mq是怎樣處理的?
消息的持久化
分布式&中間件
分布式是開發(fā)人員必經(jīng)之路,分布式必然用中間件,一下文章是本人對(duì)分布式和中間件的一些理解,可能不深,僅限個(gè)人理解,可能會(huì)用到其他的作品文獻(xiàn)等,侵權(quán)不刪,愛咋咋地。
什么是分布式
分布式系統(tǒng)跟傳統(tǒng)單個(gè)項(xiàng)目存在著一些差異:
傳統(tǒng)項(xiàng)目-存在的問題 : 1、模塊之間耦合度太高,其中一個(gè)功能升級(jí),其他的模塊都得一起升級(jí)部署。 2、開發(fā)困難,各個(gè)團(tuán)隊(duì)開發(fā)最后都要整合在一起。 3、系統(tǒng)擴(kuò)展性差。 4、不能靈活進(jìn)行分布式部署 分布式系統(tǒng)-優(yōu)點(diǎn) : 1、把模塊拆分,使用接口通信活著中間件,降低模塊之間的耦合度。 2、把項(xiàng)目拆分成若干個(gè)子項(xiàng)目,不同的團(tuán)隊(duì)負(fù)責(zé)不同的子項(xiàng)目。 3、增加功能時(shí)只需要再增加一個(gè)子項(xiàng)目,調(diào)用其他系統(tǒng)的接口就可以。 4、可以靈活的進(jìn)行分布式部署。
總結(jié): 把模塊分成獨(dú)立的工程,單節(jié)點(diǎn)運(yùn)行,如果某一個(gè)節(jié)點(diǎn)壓力大了可以單獨(dú)對(duì)這個(gè)節(jié)點(diǎn)進(jìn)行增加配置,其他節(jié)點(diǎn)不受影響。缺點(diǎn)就是系統(tǒng)之間交互需要額外的工作量來進(jìn)行接口的開發(fā)。把系統(tǒng)拆分成多個(gè)工程,需要完成系統(tǒng)的工程需要多個(gè)工程協(xié)作完成,這種形式就叫做分布式。;
分布式理論
CAP :CAP理論是分布式系統(tǒng)、特別是分布式存儲(chǔ)領(lǐng)域中被討論的最多的理論。 其中C代表一致性 (Consistency),A代表可用性(Availability),P代表分區(qū)容錯(cuò)性 (Partition tolerance)。 CAP理論告訴我們C、A、P三者不能同時(shí)滿足,最多只能滿足其中兩個(gè)。 CAP理論是分布式系統(tǒng)、特別是分布式存儲(chǔ)領(lǐng)域中被討論的最多的理論。其中C代表一致性 (Consistency),A代表可用性 (Availability),P代表分區(qū)容錯(cuò)性 (Partition tolerance)。 一致性 (Consistency): 一個(gè)寫操作返回成功,那么之后的讀請(qǐng)求都必須讀到這個(gè)新數(shù)據(jù);如果返回失敗,那么所有讀操作都不能讀到這個(gè)數(shù)據(jù)。所有節(jié)點(diǎn)訪問同一份最新的數(shù)據(jù)。 可用性 (Availability): 對(duì)數(shù)據(jù)更新具備高可用性,請(qǐng)求能夠及時(shí)處理,不會(huì)一直等待,即使出現(xiàn)節(jié)點(diǎn)失效。 分區(qū)容錯(cuò)性 (Partition tolerance): 能容忍網(wǎng)絡(luò)分區(qū),在網(wǎng)絡(luò)斷開的情況下,被分隔的節(jié)點(diǎn)仍能正常對(duì)外提供服務(wù)。
2:BASE Basically Available 基本可用 分布式系統(tǒng)在出現(xiàn)不可預(yù)知故障的時(shí)候,允許損失部分可用性 Soft state 軟狀態(tài) 軟狀態(tài)也稱為弱狀態(tài),和硬狀態(tài)相對(duì),是指允許系統(tǒng)中的數(shù)據(jù)存在中間狀態(tài),并認(rèn)為該中間狀態(tài)的存在不會(huì)影響系統(tǒng)的整體可用性,即允許系統(tǒng)在不同節(jié)點(diǎn)的數(shù)據(jù)副本之間進(jìn)行數(shù)據(jù)同步的過程存在延時(shí)。 Eventually consistent 最終一致 最終一致性強(qiáng)調(diào)的是系統(tǒng)中所有的數(shù)據(jù)副本,在經(jīng)過一段時(shí)間的同步后,最終能夠達(dá)到一個(gè)一致的狀態(tài)。因此,最終一致性的本質(zhì)是需要系統(tǒng)保證最終數(shù)據(jù)能夠達(dá)到一致,而不需要實(shí)時(shí)保證系統(tǒng)數(shù)據(jù)的強(qiáng)一致性。
CAP 與 BASE 關(guān)系 BASE是對(duì)CAP中一致性和可用性權(quán)衡的結(jié)果,其來源于對(duì)大規(guī)?;ヂ?lián)網(wǎng)系統(tǒng)分布式實(shí)踐的結(jié)論,是基于CAP定理逐步演化而來的,其核心思想是即使無法做到強(qiáng)一致性(Strong consistency),更具體地說,是對(duì) CAP 中 AP 方案的一個(gè)補(bǔ)充。其基本思路就是:通過業(yè)務(wù),犧牲強(qiáng)一致性而獲得可用性,并允許數(shù)據(jù)在一段時(shí)間內(nèi)是不一致的,但是最終達(dá)到一致性狀態(tài)。
中間件
消息中間件
消息中間件也可以稱消息隊(duì)列,是指用高效可靠的消息傳遞機(jī)制進(jìn)行與平臺(tái)無關(guān)的數(shù)據(jù)交流,并基于數(shù)據(jù)通信來進(jìn)行分布式系統(tǒng)的集成。通過提供消息傳遞和消息隊(duì)列模型,可以在分布式環(huán)境下擴(kuò)展進(jìn)程的通信。
消息隊(duì)列已經(jīng)逐漸成為企業(yè)IT系統(tǒng)內(nèi)部通信的核心手段。它具有低耦合、可靠投遞、廣播、流量控制、最終一致性等一系列功能;成為異步RPC的主要手段之一。當(dāng)今市面上有很多主流的消息中間件,比如老牌的ActiveMQ、RabbitMQ,炙手可熱的kafka,阿里巴巴自主開發(fā)的RocketMQ等。
消息中間件的組成
1、Broker 消息服務(wù)器,作為server提供消息核心服務(wù)。 2、Producer 生產(chǎn)者,消息的產(chǎn)生者,是消息的入口。業(yè)務(wù)的發(fā)起方,負(fù)責(zé)生產(chǎn)消息傳輸給Broker。 3、Consumer 消息消費(fèi)者,即消息的消費(fèi)方,是消息的出口,負(fù)責(zé)從broker獲取消息并進(jìn)行業(yè)務(wù)邏輯處理。 4、Topic 消息的主題,可以理解為消息的分類,在每個(gè)broker上都可以創(chuàng)建多個(gè)topic。發(fā)布訂閱模式下的消息統(tǒng)一匯集地,不同生產(chǎn)者向topic發(fā)送消息,由MQ服務(wù)器發(fā)布到不同的訂閱者,實(shí)現(xiàn)消息的廣播。 5、Queue 隊(duì)列,PTP模式下,特定生產(chǎn)者向特定queue發(fā)送消息,消費(fèi)者訂閱特定的queue完成指定的消息的接收。 6、Message 消息體,每一條發(fā)送的消息主體,根據(jù)不同通信協(xié)議定義的固定格式進(jìn)行編碼的數(shù)據(jù)包,來封裝業(yè)務(wù)數(shù)據(jù),實(shí)現(xiàn)消息的傳輸。 7、Exchange 交換器:用于制定隊(duì)列所在交換器,一個(gè)交換器可有多個(gè)隊(duì)列;
消息中間件的發(fā)布模式
點(diǎn)對(duì)點(diǎn)、發(fā)布訂閱 1、點(diǎn)對(duì)點(diǎn) PTP點(diǎn)對(duì)點(diǎn):使用queue作為通信載體。 點(diǎn)對(duì)點(diǎn)發(fā)布:消息生產(chǎn)者先生產(chǎn)消息發(fā)送到queue中,然后消費(fèi)者從queue中讀取出消息并且消費(fèi)這個(gè)消息。屬于一對(duì)一模式,不能夠進(jìn)行重復(fù)消費(fèi)。消費(fèi)完了之后,數(shù)據(jù)就會(huì)被刪除了。
2、發(fā)布/訂閱
Pub/Sub發(fā)布訂閱(廣播):使用topic作為通信載體。針對(duì)topic來說。只要連接上消息中間件、消費(fèi)者都可以進(jìn)行消費(fèi),只要有權(quán)限獲取到topic,消費(fèi)者之間的消費(fèi)互不影響。 消息生產(chǎn)者(producer)將消息發(fā)布到topic中,同時(shí)會(huì)有很多個(gè)消息消費(fèi)者(訂閱)消費(fèi)該消息。和點(diǎn)對(duì)點(diǎn)方式不同的是,發(fā)布到topic的消息會(huì)被所有的訂閱者消費(fèi)。
queue實(shí)現(xiàn)了負(fù)載均衡,將producer生產(chǎn)的消息發(fā)送到消息隊(duì)列中,由多個(gè)消費(fèi)者消費(fèi)。但一個(gè)消息只能被一個(gè)消費(fèi)者接受,當(dāng)沒有消費(fèi)者可用時(shí),這個(gè)消息會(huì)被保存直到有一個(gè)可用的消費(fèi)者。
topic實(shí)現(xiàn)了發(fā)布和訂閱,但發(fā)布一個(gè)消息,所有訂閱這個(gè)topic的服務(wù)都能得到這個(gè)消息,所以從1到N個(gè)訂閱者都能得到一個(gè)消息的備份。
生產(chǎn)者1,創(chuàng)建的topic為sc。消費(fèi)完了,數(shù)據(jù)不會(huì)被刪除。偏移量會(huì)有記錄。
消息中間件的作用
1、系統(tǒng)解耦 交互系統(tǒng)之間沒有直接的調(diào)用關(guān)系,只是通過消息傳輸,所以系統(tǒng)的侵入性不強(qiáng),耦合度低。
2、提高系統(tǒng)響應(yīng)時(shí)間 比如就像購物一樣,完成支付可能會(huì)涉及到先修改訂單狀態(tài)、計(jì)算會(huì)員積分、通知物流配送幾個(gè)流程才能完成;通過MQ架構(gòu)設(shè)計(jì),就可以將緊急通知(需要立刻響應(yīng)處理的)的業(yè)務(wù)放到這個(gè)調(diào)用方法中,響應(yīng)要求不高的可以使用消息隊(duì)列,放到MQ隊(duì)列中,供消費(fèi)者處理。
3、為大數(shù)據(jù)處理架構(gòu)提供服務(wù) 通過消息作為整合,大數(shù)據(jù)的背景下,消息隊(duì)列還與實(shí)時(shí)處理架構(gòu)整合,為數(shù)據(jù)處理提供性能支持。
消息中間件的應(yīng)用場(chǎng)景
1、異步通信 有些業(yè)務(wù)不想也不需要立即去處理消息。消息隊(duì)列就提供了異步處理機(jī)制,允許用戶把一個(gè)消息放入隊(duì)列,但是并不是立即處理它。想要向隊(duì)列中放入多少消息就放入多少,然后在需要的時(shí)候再去處理她們。
2、解耦 降低工程之間的強(qiáng)依賴程序,針對(duì)異構(gòu)系統(tǒng)進(jìn)行適配。在項(xiàng)目啟動(dòng)之初來預(yù)測(cè)將來項(xiàng)目會(huì)碰到什么需求,是及其困難的。通常消息系統(tǒng)在處理過程中會(huì)插入了一個(gè)隱含的、基于數(shù)據(jù)的接口層,兩邊的處理過程都要實(shí)現(xiàn)這一個(gè)接口,當(dāng)應(yīng)用發(fā)生變化的時(shí)候,可以獨(dú)立的擴(kuò)展或修改兩邊的處理過程,只要確保它們遵同樣的接口約束。
3、冗余 在有些情況下,處理數(shù)據(jù)的過程會(huì)失敗。除非數(shù)據(jù)被持久化,否則會(huì)造成數(shù)據(jù)的丟失。消息隊(duì)列把數(shù)據(jù)進(jìn)行持久化直到它們已經(jīng)被完全處理,通過這一方式規(guī)避了數(shù)據(jù)丟失風(fēng)險(xiǎn)。許多消息隊(duì)列所采用的”插入-獲取-刪除”范式中,在把一個(gè)消息從隊(duì)列中刪除之前,需要你的處理系統(tǒng)明確的指出該消息已經(jīng)被處理完畢,從而確保你的數(shù)據(jù)被安全的保存直到你使用完畢。
4、擴(kuò)展性 因?yàn)橄㈥?duì)列解耦了你的處理過程,所以增大消息入隊(duì)和處理的頻率是很容易的,只要另外增加處理的過程就可以了。不需要改變代碼、不需要調(diào)節(jié)參數(shù)。便于分布式擴(kuò)展。
5、過載保護(hù) 在訪問量劇增的情況下,應(yīng)用仍然需要繼續(xù)發(fā)揮作用,但是這樣的突發(fā)流量無法提取預(yù)知;如果以為了能處理這類瞬間峰值訪問為標(biāo)準(zhǔn)來投入資源隨時(shí)待命無疑是巨大的浪費(fèi)。使用消息隊(duì)列能夠使關(guān)鍵組件頂住突發(fā)的訪問壓力,而不會(huì)因?yàn)橥话l(fā)的超負(fù)荷的請(qǐng)求而完全崩潰。
6、可恢復(fù)性 系統(tǒng)的一部分組件失效時(shí),不會(huì)影響到整個(gè)系統(tǒng)。消息隊(duì)列降低了進(jìn)程間的耦合度,所以即使一個(gè)處理消息的進(jìn)程掛掉,加入隊(duì)列中的消息仍然可以在系統(tǒng)恢復(fù)后被處理。
7、順序保證 在大多使用場(chǎng)景下,數(shù)據(jù)處理的順序都很重要。大部分消息隊(duì)列本來就是排序的,并且能保證數(shù)據(jù)會(huì)按照特定的順序來處理。
8、緩沖 在任何重要的系統(tǒng)中,都會(huì)有需要不同的處理時(shí)間的元素。消息隊(duì)列通過一個(gè)緩沖層來幫助任務(wù)最高效率的執(zhí)行,該緩沖有助于控制和優(yōu)化數(shù)據(jù)流經(jīng)過系統(tǒng)的速度。以調(diào)節(jié)系統(tǒng)響應(yīng)時(shí)間。
9、數(shù)據(jù)流處理 分布式系統(tǒng)產(chǎn)生的海量數(shù)據(jù)流,如:業(yè)務(wù)日志、監(jiān)控?cái)?shù)據(jù)、用戶行為等,針對(duì)這些數(shù)據(jù)流進(jìn)行實(shí)時(shí)或批量采集匯總,然后進(jìn)行大數(shù)據(jù)分析是當(dāng)前互聯(lián)網(wǎng)的必備技術(shù),通過消息隊(duì)列完成此類數(shù)據(jù)收集是最好的選擇。
思考:消息中間件掛了,怎樣保證消息發(fā)送成功。怎樣保證一定是消費(fèi)成功?怎樣保證消息不回丟失?如果停電了怎么辦mq是怎樣處理的?
消息的持久化
> https://www.cnblogs.com/ciel717/p/17363789.html
rocketMq的持久化機(jī)制: RocketMQ的消息是存儲(chǔ)到磁盤上的,這樣既能保證斷電后恢復(fù),又可以讓存儲(chǔ)的消息量超出內(nèi)存的限制。RocketMQ為了提高性能,會(huì)盡可能地保證磁盤的順序?qū)?。消息在通過Producer寫入RocketMQ的時(shí)候,有兩種寫磁盤方式同步刷盤和異步刷盤。 同步刷盤:如上圖所示,只有在消息真正持久化至磁盤后,RocketMQ的Broker端才會(huì)真正地返回給Producer端一個(gè)成功的ACK響應(yīng)。同步刷盤對(duì)MQ消息可靠性來說是一種不錯(cuò)的保障,但是性能上會(huì)有較大影響,一般適用于金融業(yè)務(wù)應(yīng)用領(lǐng)域。RocketMQ同步刷盤的大致做法是,基于生產(chǎn)者消費(fèi)者模型,主線程創(chuàng)建刷盤請(qǐng)求實(shí)例 — GroupCommitRequest并在放入刷盤寫隊(duì)列后喚醒同步刷盤線程 — GroupCommitService,來執(zhí)行刷盤動(dòng)作(其中用了CAS變量和CountDownLatch來保證線程間的同步)。這里,RocketMQ源碼中用讀寫雙緩存隊(duì)列(requestsWrite/requestsRead)來實(shí)現(xiàn)讀寫分離,其帶來的好處在于內(nèi)部消費(fèi)生成的同步刷盤請(qǐng)求可以不用加鎖,提高并發(fā)度。 異步刷盤:能夠充分利用OS的PageCache的優(yōu)勢(shì),只要消息寫入PageCache即可將成功的ACK返回給Producer端。消息刷盤采用后臺(tái)異步線程提交的方式進(jìn)行,降低了讀寫延遲,提高了MQ的性能和吞吐量。
未完待續(xù)。。。
以上有個(gè)人理解,也有其他博主的博客,如有侵權(quán),請(qǐng)聯(lián)系我。
柚子快報(bào)激活碼778899分享:分布式相關(guān)應(yīng)用V-1.0.0
推薦鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。