本文章是在網(wǎng)易云課堂的課程學(xué)習(xí)中編寫(xiě),部分圖片從網(wǎng)易云課堂ppt引用
導(dǎo)語(yǔ):學(xué)習(xí)中間件,需要知道中間件的應(yīng)用場(chǎng)景,中間件的本質(zhì),可以用來(lái)做什么,為什么用,核心點(diǎn)是什么,架構(gòu)中的注意事項(xiàng)有哪些。
重點(diǎn):
分布式消息中間件:kafka、RabbitMQ
負(fù)載均衡中間件:Nginx
緩存中間件:redis
數(shù)據(jù)庫(kù)中間件:mycat
難點(diǎn):中間件在架構(gòu)的作用、底層的實(shí)現(xiàn)原理(用JAVA的技術(shù)去理解它)
另外,要考慮中間件可能出現(xiàn)的各種異常,中間件是如何解決高性能、高可用、高可靠問(wèn)題的。
一、各種架構(gòu)介紹
單體架構(gòu):升級(jí)一部分功能會(huì)影響整個(gè)系統(tǒng),耦合度太高,且維護(hù)成本高
分布式架構(gòu):
- 按照功能或技術(shù)劃分成多個(gè)子系統(tǒng),相互獨(dú)立,獨(dú)立部署
- 多系統(tǒng)協(xié)同處理一個(gè)請(qǐng)求
- 系統(tǒng)之間也可能存在相互調(diào)用,使用RPC(遠(yuǎn)程過(guò)程調(diào)用)
基于消息中間件的分布式系統(tǒng)架構(gòu):系統(tǒng)間RPC調(diào)用耦合度較強(qiáng),于是引入消息中間件,解決系統(tǒng)間的耦合。消息中間件用于系統(tǒng)之間的數(shù)據(jù)交換,臨時(shí)存儲(chǔ)一些消息、數(shù)據(jù),進(jìn)行異步處理,系統(tǒng)間沒(méi)有直接的關(guān)聯(lián),不需要接口調(diào)用
二、消息中間件的概念
什么是消息中間件
1、利用高效可靠的消息傳遞機(jī)制進(jìn)行平臺(tái)無(wú)關(guān)的數(shù)據(jù)交流;
2、并基于數(shù)據(jù)通信來(lái)進(jìn)行分布式系統(tǒng)的集成
3、通過(guò)提供消息傳遞和消息排隊(duì)模型,它可以在分布式環(huán)境下擴(kuò)展進(jìn)程間的通信
消息中間件的應(yīng)用場(chǎng)景:跨系統(tǒng)數(shù)據(jù)傳遞、高并發(fā)流量削峰、數(shù)據(jù)異步處理等
常用的消息中間件:ActiviMQ、RabbitMQ、Kafka、RocketMQ
三、消息中間件的核心設(shè)計(jì)
本質(zhì):一種具備接收請(qǐng)求、保存數(shù)據(jù)、發(fā)送數(shù)據(jù)等功能的網(wǎng)絡(luò)應(yīng)用
5大核心組成:協(xié)議、持久化機(jī)制、消息分發(fā)機(jī)制、高可用設(shè)計(jì)、高可靠設(shè)計(jì)
1、協(xié)議:
協(xié)議是計(jì)算機(jī)之間通信時(shí)共同遵從的一組約定,都遵守相同的約定,計(jì)算機(jī)之間才能相互交流。是對(duì)數(shù)據(jù)格式和計(jì)算機(jī)之間交換數(shù)據(jù)時(shí)必須遵守的規(guī)則的正式描述。
協(xié)議三要素
- 語(yǔ)法:即數(shù)據(jù)與控制信息的結(jié)構(gòu)或格式;
- 語(yǔ)義:即需要發(fā)出何種控制信息,完成何種動(dòng)作以及做出何種響應(yīng);
- 時(shí)序(同步):即事件實(shí)現(xiàn)順序的詳細(xì)說(shuō)明
Http協(xié)議三要素舉例:
- 語(yǔ)法:http規(guī)定了請(qǐng)求報(bào)文和響應(yīng)報(bào)文的具體格式。
- 語(yǔ)義:客戶端主動(dòng)發(fā)起的操作稱為請(qǐng)求;
- 時(shí)序:一個(gè)請(qǐng)求對(duì)應(yīng)一個(gè)響應(yīng)
消息中間件常用的協(xié)議:OpenWire、AMQP、MQTT、Kafka、OpenMessage
為什么消息中間件不直接使用http協(xié)議?
1、http請(qǐng)求格式較為復(fù)雜,請(qǐng)求時(shí)要傳輸很多數(shù)據(jù),請(qǐng)求頭、請(qǐng)求體、狀態(tài)碼等,不適合消息中間件,消息中間件要求高性能,盡量減少數(shù)據(jù)傳輸?shù)拇笮?br>
2、http大部分是短連接,不利于消息中間件的使用
--AMQP協(xié)議
AMQP (Advanced Message Queuing Protocol)是高級(jí)消息隊(duì)列協(xié)議04年JPMorgan Chase(摩根大通集團(tuán))聯(lián)合其他公司共同設(shè)計(jì)。
特性:事務(wù)支持、持久化支持,出生金融行業(yè),在可靠性消息處理上具備天然的優(yōu)勢(shì)。
使用:RabbitMQ、ActiveMQ
--MQTT協(xié)議
MQTT (Message Queuing Telemetry Transport)消息隊(duì)列遙測(cè)傳輸是IBM開(kāi)發(fā)的一個(gè)即時(shí)通訊協(xié)議,物聯(lián)網(wǎng)系統(tǒng)架構(gòu)中的重要組成部分。
特性:輕量、結(jié)構(gòu)簡(jiǎn)單、傳輸快、沒(méi)有事務(wù)支持、沒(méi)有持久化相關(guān)設(shè)計(jì)
應(yīng)用場(chǎng)景:適用于計(jì)算能力有限、低帶寬、網(wǎng)絡(luò)不穩(wěn)定的場(chǎng)景。
使用:RabbitMQ、ActiveMQ
--Open Message協(xié)議
OpenMessaging是近一兩年由阿里發(fā)起,與雅虎、滴滴出行、Streamlio等公司共同參與創(chuàng)立的分布式消息中間件、流處理領(lǐng)域的應(yīng)用開(kāi)發(fā)標(biāo)準(zhǔn)。是國(guó)內(nèi)首個(gè)在全球范圍內(nèi)發(fā)起的分布式消息領(lǐng)域國(guó)際標(biāo)準(zhǔn)
特性:結(jié)構(gòu)簡(jiǎn)單、解析快、有事務(wù)設(shè)計(jì)、有持久化設(shè)計(jì)
使用:Apache AocketMQ
--Kafka協(xié)議
Kafka協(xié)議是基于TCP的二進(jìn)制協(xié)議。消息內(nèi)部是通過(guò)長(zhǎng)度來(lái)分隔,由一些基本數(shù)據(jù)類型組成。最初是用于日志處理,沒(méi)有事務(wù)支持。
特性:結(jié)構(gòu)簡(jiǎn)單、解析快、無(wú)事務(wù)設(shè)計(jì)、有持久化設(shè)計(jì)
使用:kafka
2、持久化:
簡(jiǎn)單來(lái)說(shuō)就是將數(shù)據(jù)存入磁盤,而不是存在內(nèi)存中隨服務(wù)重啟而消失,使數(shù)據(jù)能夠永久保存叫做持久化。
常用持久化方式
3、消息分發(fā)
消費(fèi)者獲取消息有兩種模式:推送模式、消息分發(fā)
應(yīng)用消息分發(fā)策略的場(chǎng)景:
要正確轉(zhuǎn)發(fā)到不同的系統(tǒng)
支付失敗,要有重發(fā)的機(jī)制
常用的消息中間件分發(fā)策略
4、高可用
高可用性是服務(wù)可用性,指產(chǎn)品在規(guī)定的條件和規(guī)定的時(shí)刻或時(shí)間區(qū)間內(nèi)處于可執(zhí)行規(guī)定功能狀態(tài)的能力。
當(dāng)業(yè)務(wù)量大時(shí),一臺(tái)消息中間件服務(wù)器可能無(wú)法滿足需求,所以需要消息中間件能夠集群部署,來(lái)達(dá)到高可用的目的。
Master-Slave主從共享數(shù)據(jù)的部署方式:主從讀取的是同一個(gè)數(shù)據(jù)源
Master-Slave主從同步部署方式:數(shù)據(jù)放在三臺(tái)服務(wù)器,解決負(fù)載均衡,三臺(tái)服務(wù)器可同時(shí)對(duì)外服務(wù)。但是插入或修改數(shù)據(jù)只在master服務(wù)進(jìn)行,再同步到其他兩臺(tái)服務(wù)器,會(huì)占用較大的帶寬
Broker-Cluster多主集群同步部署方式:三個(gè)服務(wù)都作為master服務(wù),數(shù)據(jù)放在三臺(tái)服務(wù)器,數(shù)據(jù)是一樣的。插入或修改數(shù)據(jù)在集群中的三個(gè)服務(wù)均可進(jìn)行,三個(gè)服務(wù)相互同步
Broker-Cluster多主集群轉(zhuǎn)發(fā)部署方式:數(shù)據(jù)存放在broker-1,broker-2只同步元數(shù)據(jù)(數(shù)據(jù)的描述,比如數(shù)據(jù)在哪里存放的、數(shù)據(jù)隊(duì)列是哪個(gè)),通過(guò)請(qǐng)求轉(zhuǎn)發(fā)或數(shù)據(jù)代理可訪問(wèn)到數(shù)據(jù),同步共享元數(shù)據(jù),開(kāi)銷較小。缺點(diǎn)是,broker-1掛了的話,數(shù)據(jù)就沒(méi)了。
Master-Slaver與Broker-Cluster結(jié)合:既實(shí)現(xiàn)負(fù)載均衡,又對(duì)數(shù)據(jù)進(jìn)行熱備份。既滿足集群,又滿足高可用。
5、高可靠:
高可靠性是指系統(tǒng)可以無(wú)故障地持續(xù)運(yùn)行。比如一個(gè)系統(tǒng)從來(lái)不崩潰、報(bào)錯(cuò),或者崩潰、報(bào)錯(cuò)的幾率較低,那就是高可靠。在高并發(fā)業(yè)務(wù)場(chǎng)景下,如果不能保證系統(tǒng)的高可靠,那造成的損失將會(huì)非常嚴(yán)重。
保證消息中間件的高可靠性,可以從以下幾方面考慮:
1、消息傳輸可靠:通過(guò)協(xié)議來(lái)保證系統(tǒng)間數(shù)據(jù)解析的正確性。
2、消息存儲(chǔ)可靠:通過(guò)持久化來(lái)保證消息的存儲(chǔ)可靠性