一啊犬、消息
1、什么是消息
消息本質(zhì)上是一種數(shù)據(jù)結(jié)構(gòu)(當(dāng)然壁查,對象也可以看做是一種特殊的消息)觉至,它包含消費(fèi)者與服務(wù)雙方都能識別的數(shù)據(jù),這些數(shù)據(jù)需要在不同的進(jìn)程(機(jī)器)之間進(jìn)行傳遞睡腿,并可能會(huì)被多個(gè)完全不同的客戶端消費(fèi)
2语御、消息分類
同步消息 例如:遠(yuǎn)程調(diào)用服務(wù),同步RPC
異步消息 客戶端主服務(wù)不需要等待服務(wù)處理消息席怪,簡單來說就是不阻塞应闯。
3、消息的重要概念
消息代理(message broker)
目的地(destination)
二挂捻、隊(duì)列
1碉纺、概念
隊(duì)列(Queue),是先進(jìn)先出(FIFO, First-In-First-Out)的線性表刻撒,通俗的講隊(duì)列就是一群人或者事物按照排好的順序等待接受服務(wù)或者處理
2骨田、分類
本地隊(duì)列
本地隊(duì)列按照功能可劃分為初始化隊(duì)列,傳輸隊(duì)列疫赎,目標(biāo)隊(duì)列和死信隊(duì)列盛撑。初始化隊(duì)列用作消息觸發(fā)功能。傳輸隊(duì)列只是暫存待傳的消息捧搞,條件許可的情況下,通過管道將消息傳送到其他的隊(duì)列管理器狮荔。目標(biāo)隊(duì)列是消息的目的地胎撇,可以長期存放消息。如果消息不能送達(dá)目標(biāo)隊(duì)列殖氏,也不能再路由出去晚树,則被自動(dòng)放入死信隊(duì)列保存。
別名隊(duì)列&遠(yuǎn)程隊(duì)列
只是一個(gè)隊(duì)列定義雅采,用來指定遠(yuǎn)端隊(duì)列管理器的隊(duì)列爵憎。使用了遠(yuǎn)程隊(duì)列,程序就不需要知道目標(biāo)隊(duì)列的位置婚瓜。
模型隊(duì)列
模型隊(duì)列定義了一套本地隊(duì)列的屬性結(jié)合宝鼓,一旦打開模型隊(duì)列,隊(duì)列管理器會(huì)按照這些屬性動(dòng)態(tài)地創(chuàng)建出一個(gè)本地隊(duì)列巴刻。
三愚铡、消息隊(duì)列
1、什么是MQ
MQ全稱(Message Queue)又名消息隊(duì)列,是一種異步通訊的中間件沥寥“幔可以將它理解成郵局,發(fā)送者將消息傳遞到郵局邑雅,然后由郵局幫我們發(fā)送給具體的消息接收者(消費(fèi)者)片橡,具體發(fā)送過程與時(shí)間我們無需關(guān)心,它也不會(huì)干擾我進(jìn)行其它事情淮野。
它被廣泛的應(yīng)用與跨平臺锻全、跨系統(tǒng)的分布式系統(tǒng)之間,為它們提供高效可靠的異步傳輸機(jī)制
2录煤、特點(diǎn)
-
可靠性傳輸
是消息中間件的重要特點(diǎn)鳄厌,對于應(yīng)用來說,只要成功把數(shù)據(jù)提交給消息中間件妈踊,那么關(guān)于數(shù)據(jù)可靠傳輸?shù)膯栴}就由消息中間件來負(fù)責(zé)
-
不重復(fù)傳輸
不重復(fù)傳播也就是斷點(diǎn)續(xù)傳的功能了嚎,特別適合網(wǎng)絡(luò)不穩(wěn)定的環(huán)境,節(jié)約網(wǎng)絡(luò)資源
-
異步性傳輸
異步性傳輸是指廊营,接受信息雙方不必同時(shí)在線歪泳,具有脫機(jī)能力和安全性
-
消息驅(qū)動(dòng)
接到消息后主動(dòng)通知消息接收方
-
支持事務(wù)
應(yīng)用程序可以把一些數(shù)據(jù)更新組合成一個(gè)工作單元,這些更新通常是邏輯相關(guān)的露筒,為了保障數(shù)據(jù)完整性呐伞,所有的更新必須同時(shí)成功或者同時(shí)失敗
3、應(yīng)用場景
-
異步-流量削峰
例如: 在電子商務(wù)一些秒殺慎式、促銷活動(dòng)中
-
異步-系統(tǒng)解耦
例如: 發(fā)送短信伶氢、發(fā)送郵件、通知物流等
備注
消息隊(duì)列使利用發(fā)布-訂閱模式工作瘪吏,消息發(fā)送者(生產(chǎn)者)發(fā)布消息癣防,一個(gè)或多個(gè)消息接受者(消費(fèi)者)訂閱消息。 消息發(fā)送者(生產(chǎn)者)和消息接受者(消費(fèi)者)之間沒有直接耦合掌眠,消息發(fā)送者將消息發(fā)送至分布式消息隊(duì)列即結(jié)束對消息的處理蕾盯,消息接受者從分布式消息隊(duì)列獲取該消息后進(jìn)行后續(xù)處理,并不需要知道該消息從何而來蓝丙。對新增業(yè)務(wù)级遭,只要對該類消息感興趣,即可訂閱該消息渺尘,對原有系統(tǒng)和業(yè)務(wù)沒有任何影響挫鸽,從而實(shí)現(xiàn)網(wǎng)站業(yè)務(wù)的可擴(kuò)展性設(shè)計(jì)。
四沧烈、JMS與AMQP
JMS
JMS(JAVA Message Service,java消息服務(wù))是java的消息服務(wù) JMS是一套 API,是j2EE標(biāo)準(zhǔn)的一部分掠兄。
JMS是由Sun公司早期提出的消息標(biāo)準(zhǔn),旨在為java應(yīng)用提供統(tǒng)一的消息操作,包括create蚂夕、send迅诬、receive等
JMS是Java Enterprise Edition的一部分。從使用角度看婿牍,JMS和JDBC擔(dān)任差不多的角色侈贷,用戶都是根據(jù)相應(yīng)的接口可以和實(shí)現(xiàn)了JMS的服務(wù)進(jìn)行通信,進(jìn)行相關(guān)的操作
消息模型
點(diǎn)到點(diǎn)(P2P)模型
結(jié)構(gòu)圖
說明
使用隊(duì)列(Queue)作為消息通信載體等脂;滿足生產(chǎn)者與消費(fèi)者模式俏蛮,一條消息只能被一個(gè)消費(fèi)者使用,未被消費(fèi)的消息在隊(duì)列中保留直到被消費(fèi)或超時(shí)上遥。比如:我們生產(chǎn)者發(fā)送100條消息的話搏屑,兩個(gè)消費(fèi)者來消費(fèi)一般情況下兩個(gè)消費(fèi)者會(huì)按照消息發(fā)送的順序各自消費(fèi)一半(也就是你一個(gè)我一個(gè)的消費(fèi)。)
發(fā)布/訂閱(Pub/Sub)模型
結(jié)構(gòu)圖
說明
發(fā)布訂閱模型(Pub/Sub) 使用主題(Topic)作為消息通信載體粉楚,類似于廣播模式辣恋;發(fā)布者發(fā)布一條消息,該消息通過主題傳遞給所有的訂閱者模软,在一條消息廣播之后才訂閱的用戶則是收不到該條消息的伟骨。
消息數(shù)據(jù)格式
StreamMessage -- Java原始值的數(shù)據(jù)流
MapMessage--一套名稱-值對
TextMessage--一個(gè)字符串對象
ObjectMessage--一個(gè)序列化的 Java對象
BytesMessage--一個(gè)字節(jié)的數(shù)據(jù)流
AMQP
AMQP(advanced message queuing protocol) 是一個(gè)提供統(tǒng)一消息服務(wù)的應(yīng)用層標(biāo)準(zhǔn)協(xié)議,基于此協(xié)議的客戶端與消息中間件可傳遞消息燃异,并不受客戶端/中間件不同產(chǎn)品携狭,可以跨語法開發(fā)
AMQP是一種協(xié)議,更準(zhǔn)確的說是一種binary wire-level protocol(鏈接協(xié)議),兼容JMS
常見的消息中間件
功能 | 消息隊(duì)列 RocketMQ | Apache RocketMQ (開源) | 消息隊(duì)列 Kafka | Apache Kafka (開源) |
---|---|---|---|---|
安全防護(hù) | 支持 | 不支持 | 支持 | 不支持 |
主子賬號支持 | 支持 | 不支持 | 支持 | 不支持 |
可靠性 | - 同步刷盤 - 同步雙寫 - 超3份數(shù)據(jù)副本 - 99.99999999% | - 同步刷盤 - 異步刷盤 | - 同步刷盤 - 同步雙寫 - 超3份數(shù)據(jù)副本 - 99.99999999% | 異步刷盤回俐,丟數(shù)據(jù)概率高 |
可用性 | - 非常好逛腿,99.95% - Always Writable | 好 | - 非常好,99.95% - Always Writable | 好 |
橫向擴(kuò)展能力 | - 支持平滑擴(kuò)展 - 支持百萬級 QPS | 支持 | - 支持平滑擴(kuò)展 - 支持百萬級 QPS | 支持 |
Low Latency | 支持 | 不支持 | 支持 | 不支持 |
消費(fèi)模型 | Push / Pull | Push / Pull | Push / Pull | Pull |
定時(shí)消息 | 支持(可精確到秒級) | 支持(只支持18個(gè)固定 Level) | 暫不支持 | 不支持 |
事務(wù)消息 | 支持 | 不支持 | 不支持 | 不支持 |
順序消息 | 支持 | 支持 | 暫不支持 | 支持 |
全鏈路消息軌跡 | 支持 | 不支持 | 暫不支持 | 不支持 |
消息堆積能力 | 百億級別 不影響性能 | 百億級別 影響性能 | 百億級別 不影響性能 | 影響性能 |
消息堆積查詢 | 支持 | 支持 | 支持 | 不支持 |
消息回溯 | 支持 | 支持 | 支持 | 不支持 |
消息重試 | 支持 | 支持 | 暫不支持 | 不支持 |
死信隊(duì)列 | 支持 | 支持 | 不支持 | 不支持 |
性能(常規(guī)) | 非常好 百萬級 QPS | 非常好 十萬級 QPS | 非常好 百萬級 QPS | 非常好 百萬級 QPS |
性能(萬級 Topic 場景) | 非常好 百萬級 QPS | 非常好 十萬級 QPS | 非常好 百萬級 QPS | 低 |
性能(海量消息堆積場景) | 非常好 百萬級 QPS | 非常好 十萬級 QPS | 非常好 百萬級 QPS | 低 |
開發(fā)語言 | Java | Erlang | Java | C |
客戶端支持語言 | Java鲫剿、C鳄逾、 C++、 Python灵莲、 PHP、 Perl殴俱、.net 等 | Java政冻、C、 C++线欲、 Python明场、 PHP、 Perl李丰、.net 等 | Java C++(不成熟) | python苦锨、 java、 php、.net 等 |
事務(wù) | 支持 | 不支持 | 支持 | 不支持 |
集群 | 支持 | 支持 | 支持 | 不支持 |
負(fù)載均衡 | 支持 | 支持 | 支持 | 不支持 |