MQ簡介:MQ全稱為Message Queue, 消息隊列(MQ)是一種應用程序?qū)贸绦虻耐ㄐ欧椒ǜА贸绦蛲ㄟ^寫和檢索出入列隊的針對應用程序的數(shù)據(jù)(消息)來通信甘耿,而無需專用連接來鏈接它們。消息傳遞指的是程序之間通過在消息中發(fā)送數(shù)據(jù)進行通信兽掰,而不是通過直接調(diào)用彼此來通信芭碍,直接調(diào)用通常是用于諸如遠程過程調(diào)用的技術(shù)。排隊指的是應用程序通過隊列來通信孽尽。隊列的使用除去了接收和發(fā)送應用程序同時執(zhí)行的要求窖壕。其中較為成熟的MQ產(chǎn)品有IBMWEBSPHERE MQ。
MQ特點:
MQ的消費-生產(chǎn)者模型的一個典型的代表杉女,一端往消息隊列中不斷的寫入消息瞻讽,而另一端則可以讀取或者訂閱隊列中的消息。MQ和JMS類似熏挎,但不同的是JMS是SUN Java消息中間件服務的一個標準和API定義速勇,而MQ則是遵循了AMQP協(xié)議的具體實現(xiàn)和產(chǎn)品。
使用場景:
在項目中婆瓜,將一些無需即時返回且耗時的操作提取出來快集,進行了異步處理,而這種異步處理的方式大大的節(jié)省了服務器的請求響應時間廉白,從而提高了系統(tǒng)的吞吐量个初。
JMS簡介:
JMS即Java消息服務(Java Message Service)應用程序接口是一個Java平臺中關(guān)于面向消息中間件(MOM)的API,用于在兩個應用程序之間猴蹂,或分布式系統(tǒng)中發(fā)送消息院溺,進行異步通信。Java消息服務是一個與具體平臺無關(guān)的API磅轻,絕大多數(shù)MOM提供商都對JMS提供支持珍逸。
定義:
JMS(Java Messaging Service)是Java平臺上有關(guān)面向消息中間件(MOM)的技術(shù)規(guī)范,它便于消息系統(tǒng)中的Java應用程序進行消息交換,并且通過提供標準的產(chǎn)生聋溜、發(fā)送谆膳、接收消息的接口簡化企業(yè)應用的開發(fā),翻譯為Java消息服務撮躁。
簡介:
JMS是一種與廠商無關(guān)的 API漱病,用來訪問消息收發(fā)系統(tǒng)消息。它類似于JDBC(Java DatabaseConnectivity):這里把曼,JDBC 是可以用來訪問許多不同關(guān)系數(shù)據(jù)庫的 API杨帽,而 JMS 則提供同樣與廠商無關(guān)的訪問方法,以訪問消息收發(fā)服務嗤军。許多廠商目前都支持JMS注盈,包括 IBM 的 MQSeries、BEA的 Weblogic JMS service和 Progress 的 SonicMQ叙赚,這只是幾個例子老客。 JMS 使您能夠通過消息收發(fā)服務(有時稱為消息中介程序或路由器)從一個 JMS 客戶機向另一個JMS客戶機發(fā)送消息僚饭。消息是 JMS 中的一種類型對象,由兩部分組成:報頭和消息主體胧砰。報頭由路由信息以及有關(guān)該消息的元數(shù)據(jù)組成浪慌。消息主體則攜帶著應用程序的數(shù)據(jù)或有效負載。根據(jù)有效負載的類型來劃分朴则,可以將消息分為幾種類型,它們分別攜帶:簡單文本(TextMessage)钓简、可序列化的對象 (ObjectMessage)乌妒、屬性集合 (MapMessage)、字節(jié)流 (BytesMessage)外邓、原始值流 (StreamMessage)撤蚊,還有無有效負載的消息 (Message)。
JMS和MQ的關(guān)系:
JMS是一個用于提供消息服務的技術(shù)規(guī)范损话,它制定了在整個消息服務提供過程中的所有數(shù)據(jù)結(jié)構(gòu)和交互流程侦啸。而MQ則是消息隊列服務,是面向消息中間件(MOM)的最終實現(xiàn)丧枪,是真正的服務提供者光涂;MQ的實現(xiàn)可以基于JMS,也可以基于其他規(guī)范或標準拧烦。
支持JMS的開源MQ:
目前選擇的最多的是ActiveMQ忘闻。
ActiveMQ 是Apache出品,最流行的恋博,能力強勁的開源消息總線齐佳。ActiveMQ 是一個完全支持JMS1.1和J2EE 1.4規(guī)范的 JMS Provider實現(xiàn),盡管JMS規(guī)范出臺已經(jīng)是很久的事情了,但是JMS在當今的J2EE應用中間仍然扮演著特殊的地位。
主要特點:
- 多種語言和協(xié)議編寫客戶端债沮。語言: Java, C, C++, C#, Ruby, Perl, Python, PHP炼吴。應用協(xié)議: OpenWire,Stomp REST,WSNotification,XMPP,AMQP
- 完全支持JMS1.1和J2EE 1.4規(guī)范 (持久化,XA消息,事務)
- 對spring的支持,ActiveMQ可以很容易內(nèi)嵌到使用Spring的系統(tǒng)里面去,而且也支持Spring2.0的特性
- 通過了常見J2EE服務器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的測試,其中通過JCA 1.5 resource adaptors的配置,可以讓ActiveMQ可以自動的部署到任何兼容J2EE 1.4 商業(yè)服務器上
- 支持多種傳送協(xié)議:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
- 支持通過JDBC和journal提供高速的消息持久化
- 從設計上保證了高性能的集群,客戶端-服務器,點對點
- 支持Ajax
- 支持與Axis的整合
- 可以很容易得調(diào)用內(nèi)嵌JMS provider,進行測試
- ActiveMQ速度非常快疫衩;一般要比jbossMQ快10倍硅蹦。
優(yōu)點:是一個快速的開源消息組件(框架),支持集群隧土,同等網(wǎng)絡提针,自動檢測,TCP曹傀,SSL辐脖,廣播,持久化皆愉,XA嗜价,和J2EE1.4容器無縫結(jié)合艇抠,并且支持輕量級容器和大多數(shù)跨語言客戶端上的Java虛擬機。消息異步接受久锥,減少軟件多系統(tǒng)集成的耦合度家淤。消息可靠接收,確保消息在中間件可靠保存瑟由,多個消息也可以組成原子事務絮重。
缺點:ActiveMQ默認的配置性能偏低,需要優(yōu)化配置歹苦,但是配置文件復雜青伤,ActiveMQ本身不提供管理工具;示例代碼少殴瘦;主頁上的文檔看上去比較全面狠角,但是缺乏一種有效的組織方式,文檔只有片段蚪腋,用戶很難由淺入深進行了解丰歌,二、文檔整體的專業(yè)性太強屉凯。在研究階段可以通過查maillist立帖、看Javadoc、分析源代碼來了解悠砚。
ActiveMQ應用場景:
1厘惦、 不同語言應用集成
ActiveMQ 中間件用Java語言編寫,因此自然提供Java客戶端 API哩簿。但是ActiveMQ 也為C/C++宵蕉、.NET、Perl节榜、PHP羡玛、Python、Ruby 和一些其它語言提供客戶端宗苍。在你考慮如何集成不同平臺不同語言編寫應用的時候稼稿,ActiveMQ 擁有巨大優(yōu)勢。在這樣的例子中讳窟,多種客戶端API通過ActiveMQ 發(fā)送和接受消息成為可能让歼,無論使用的是什么語言。此外丽啡,ActiveMQ 還提供交叉語言功能谋右,該功能整合這種功能硫嘶,無需使用遠程過程調(diào)用(RPC)確實是個優(yōu)勢发皿,因為消息協(xié)助應用解耦。
2、 作為RPC的替代
使用RPC同步調(diào)用的應用十分普遍衡未。假設大多數(shù)客戶端服務器應用使用RPC臼婆,包括ATM丁频、大多數(shù)WEB應用按声、信用卡系統(tǒng)、銷售點系統(tǒng)等等终蒂。盡管很多系統(tǒng)很成功蜂林,但是轉(zhuǎn)換使用異步消息可以帶來很多好處,而且也不會放棄響應保證拇泣。使用同步請求的系統(tǒng)在規(guī)模上有較大的限制悉尾,因為請求會被阻塞,從而導致整個系統(tǒng)變慢挫酿。如果使用異步消息替代,可以很容易增加額外的消息接收者愕难,使得消息能被并發(fā)消耗早龟,從而加快請求處理。當然猫缭,你的系統(tǒng)應用間應該是解耦的葱弟。
3、 應用之間解耦
正如之前討論的猜丹,緊耦合架構(gòu)可以導致很多問題芝加,尤其是如果他們是分布的。松耦合架構(gòu)射窒,在另一方面藏杖,證實了更少的依賴性,能夠更好地處理不可預見的改變脉顿。不僅可以在系統(tǒng)中改變組件而不影響整個系統(tǒng)蝌麸,而且組件交互也相當?shù)暮唵巍O啾仁褂猛降南到y(tǒng)(調(diào)用者必須等待被調(diào)用者返回信息)艾疟,異步系統(tǒng)(調(diào)用方發(fā)送消息后就不管来吩,即fire-and-forget)能夠給我們帶來事件驅(qū)動架構(gòu)(event-driven architecture EDA)。
4蔽莱、 作為事件驅(qū)動架構(gòu)的主干
解耦弟疆,異步架構(gòu)的系統(tǒng)允許通過代理器自己配置更多的客戶端,內(nèi)存等(即vertical scalability)來擴大系統(tǒng)盗冷,而不是增加更多的代理器(即horizontal scalability)怠苔。考慮如亞馬遜這樣繁忙的電子商務系統(tǒng)仪糖。當用戶購買物品嘀略,事實上系統(tǒng)需要很多步驟去處理恤溶,包括下單,創(chuàng)建發(fā)票帜羊,付款咒程,執(zhí)行訂單,運輸?shù)人嫌5怯脩粝聠魏笳室觯瑫⒓捶祷亍爸x謝你下單”的界面。不只是沒有延遲奶段,而且用戶還會受到一封郵件表明訂單已經(jīng)收到饥瓷。在亞馬遜下單的例子就是一個多步處理的例子。每一步都由單獨的服務去處理痹籍。當用戶下單是呢铆,有一個同步的體積表單動作,但整個處理流程并不通過瀏覽器同步處理蹲缠。相反地棺克,訂單馬上被接受和反饋。而剩下的步驟就通過異步處理线定。如果在處理過程中出錯娜谊,用戶會通過郵件收到通知。這樣的異步處理能提供高負載和高可用性斤讥。
5纱皆、 提高系統(tǒng)擴展性
很多使用事件驅(qū)動設計的系統(tǒng)是為了獲得高可擴展性,例如電子商務芭商,政府派草,制造業(yè),線上游戲等铛楣。通過異步消息分開商業(yè)處理步驟給各個應用澳眷,能夠帶來很多可能性◎劝考慮設計一個應用來完成一項特殊的任務钳踊。這就是面向服務的架構(gòu)(service-oriented architecture SOA)。每一個服務完成一個功能并且只有一個功能勿侯。應用就通過服務組合起來拓瞪,服務間使用異步消息和最終一致性。這樣的設計便可以引入一個復雜事件處理概念(complex event processing CEP)助琐。使用CEP祭埂,部件間的交互可以被記錄追蹤。在異步消息系統(tǒng)中,可以很容易在部件間增加一層處理蛆橡。
其他開源JMS供應商舌界;
jbossmq(jboss 4)
jboss messaging (jboss 5)
joram-4.3.21 2006-09-22
openjms-0.7.7-alpha-3.zipDecember 26,2005
mantamq
ubermq
SomnifugiJMS 2005-7-27
開源的JMSProvider大部分都已經(jīng)停止發(fā)展了,剩下的幾個都是找到了東家泰演,和某種J2EE 服務器掛鉤呻拌,比如jbossmq 與jboss,joram與jonas(objectweb組織),ActiveMQ 與Geronimo(ASF APACHE基金組織)睦焕,而在這3個之間藐握,從網(wǎng)絡底層來看,只有ActiveMQ使用了NIO垃喊,單從這個角度來看ActiveMQ在性能上會有一定的優(yōu)勢猾普。