消息隊(duì)列概述
消息隊(duì)列是系統(tǒng)中重要的中間件,主要解決應(yīng)用耦合,異步消息,高并發(fā)等問題。實(shí)現(xiàn)高性能,高可用,可伸縮和最終一致性架構(gòu)。
應(yīng)用場(chǎng)景
異步處理場(chǎng)景

在串行模式中,用戶注冊(cè)成功寫入數(shù)據(jù)庫(kù)之后,會(huì)發(fā)站內(nèi)信,然后發(fā)短信通知。串行處理任務(wù)完成Respose給用戶。

在并行模式中,用戶注冊(cè)成之后寫入數(shù)據(jù)庫(kù)之后,將發(fā)站內(nèi)信、短信的任務(wù)寫入消息隊(duì)列中,供其他系統(tǒng)的去讀取處理。
業(yè)務(wù)解耦場(chǎng)景


在系統(tǒng)間引入MQ可以降低系統(tǒng)的耦合度,提高系統(tǒng)的高可用。
高并發(fā)場(chǎng)景

面對(duì)高并發(fā)請(qǐng)求,引入MQ,可以控制請(qǐng)求人數(shù),緩解短時(shí)間高流量搞垮系統(tǒng)
JMS消息服務(wù)
JMS消息模型
P2P模型

每個(gè)消息只有一個(gè)消費(fèi)者(Consumer)(即一旦被消費(fèi),消息就不再在消息隊(duì)列中)
發(fā)送者和接收者之間在時(shí)間上沒有依賴性,也就是說當(dāng)發(fā)送者發(fā)送了消息之后,不管接收者有沒有正在運(yùn)行,它不會(huì)影響到消息被發(fā)送到隊(duì)列
接收者在成功接收消息之后需向隊(duì)列應(yīng)答成功
Pub/Sub模式

每個(gè)消息可以有多個(gè)消費(fèi)者
發(fā)布者和訂閱者之間有時(shí)間上的依賴性。針對(duì)某個(gè)主題的訂閱者,它必須創(chuàng)建一個(gè)訂閱者之后,才能消費(fèi)發(fā)布者的消息。
為了消費(fèi)消息,訂閱者必須保持運(yùn)行的狀態(tài)。
常用的MQ
ActiveMQ
⒈ 多種語言和協(xié)議編寫客戶端。
語言: Java,C,C++,C#,Ruby,Perl,Python,PHP。
應(yīng)用協(xié)議: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
⒉ 完全支持JMS1.1和J2EE 1.4規(guī)范 (持久化,XA消息,事務(wù))
⒊ 對(duì)Spring的支持
⒋ 通過了常見J2EE服務(wù)器(如 Geronimo,JBoss 4,GlassFish,WebLogic)的測(cè)試,其中通 過JCA 1.5 resource adaptors的配置,可以讓ActiveMQ可以自動(dòng)的部署到任何兼容J2EE 1.4 商業(yè)服務(wù)器上
⒌ 支持多種傳送協(xié)議:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
⒍ 支持通過JDBC和journal提供高速的消息持久化
⒎ 從設(shè)計(jì)上保證了高性能的集群,客戶端-服務(wù)器,點(diǎn)對(duì)點(diǎn)
⒏ 支持Ajax
⒐ 支持與Axis的整合
⒑ 可以很容易得調(diào)用內(nèi)嵌JMS provider,進(jìn)行測(cè)試
RabbitMQ

用于在分布式系統(tǒng)中存儲(chǔ)轉(zhuǎn)發(fā)消息,在易用性、擴(kuò)展性、高可用性等方面表現(xiàn)不俗。
Kafka
Kafka是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng),它可以處理消費(fèi)者規(guī)模的網(wǎng)站中的所有動(dòng)作流數(shù)據(jù)。即使是非常普通的硬件Kafka也可以支持每秒數(shù)百萬的消息。一般應(yīng)用在大數(shù)據(jù)日志處理或?qū)?shí)時(shí)性(少量延遲),可靠性(少量丟數(shù)據(jù))要求稍低的場(chǎng)景使用。
