開源消息總線ActiveMQ
一、消息中間件MOM(Message-Oriented Middleware)
消息中間件是解決異步分布式系統中通訊和排隊問題的中間件技術。它利用高效可靠的消息傳遞機制進行平臺無關的數據交流,并基于數據通信來進行分布式系統的集成。通過提供消息傳遞和消息排隊模型,它可以在分布式環境下擴展進程間的通信。
二、JMS
JMS即Java消息服務(Java Message Service)應用程序接口是一個Java平臺中關于面向消息中間件(MOM)的API,用于在兩個應用程序之間,或分布式系統中發送消息,進行異步通信。Java消息服務是一個與具體平臺無關的API,絕大多數MOM提供商都對JMS提供支持。
JMS 定義了兩種方式:Quere(點對點);Topic(發布/訂閱)。 ConnectionFactory 是連接工廠,負責創建Connection。 Connection 負責創建 Session。 Session 創建 MessageProducer(用來發消息) 和 MessageConsumer(用來接收消息)。 Destination 是消息的目的地。
三、ActiveMQ
1、概述
ActiveMQ 則是MOM的一個跨語言跨平臺實現,它是Apache出品,最流行的、能力強勁的開源消息總線。它完整實現了JMS1.1和J2EE1.4中JMS服務(JSM定義了MOM系統的服務和接口,可以提供可靠的消息傳輸、事物和過濾等服務),還具備了集群、事物、存儲轉發、持久化等企業特性。
2、連接方式
ActiveMQ提供了豐富連接方式,按照耦合的緊密程度可以分為:直接內嵌于JBoss等J2EE容器,直接利用AMOP、Openwire等標準協議,通過適配器與Java、C++、AJAX等程序連接以及橋式連接其他JMS。
3、特性及其作用
處理事務性的消息
ActiveMQ的此種特性主要管理消息的事務以及消息持久化,即使在出錯時也不會漏掉一條消息。消息服務器需要進行信息持久化,一個服務器集群可以提高其可用性,ActiveMQ正是這樣的一個高可用性的消息服務器,典型的情況就是當一個Server Node掉線的時候,它上面的所有消息都會被保存下來,以便在它重新上線時繼續處理。
高性能的數據分發
ActiveMQ的這個特性主要關注的是消息的吞吐率以及高效的消息投遞路由,中心思想就是在一個大的網絡中盡可能快的傳遞大量的并且快速改變的消息數據。
鑒于大量的數據和頻繁的數據數據交換負荷很高,所以這種情況下很少使用數據持久化,在失敗時丟失幾條數據也是可以接受的因為老的數據通常都不再被需要了,最新的數據才是真正我們關心的。
集群和通用的異步消息模型
ActiveMQ的這種特性重點在網絡延遲和速度,當實現一個web或者EJB集群的時候,目的是維護一個node集群,典型的是使用多點廣播來 discovery&keep-alive然后使用socket直接連接這些node來進行高效的通信。這和使用JMS provider在EJB-Style或者WS-style的服務中作為RMI層是很相似的,都能使用多點廣播來discovery&keep- alive并且使用socket直接連接通信以減少延遲。所以與其使用不同的服務器來協調client之間的通信,不如讓client直接和彼此通信來減少延遲。
Ps: 此段主要講的是activeMQ的node之間會有高效的異步通信機制,網絡延遲小并且高效
網絡數據流
ActiveMQ的這種特性關注點是activeMQ的ajax支持,越來越多的人希望數據流能實時的傳遞到網絡瀏覽器中,例如金融行業的股票價格數據,實時的在展示IM會話,實時拍賣并且動態更新內容和消息。鑒于這種情況,我們把ActiveMQ集成到了web容器中來提供封閉的網絡集成,使用HTTP POSTS來發布消息并且在js中通過HTTP GET來接受并展示消息。
簡易的使用HTTP來傳遞消息的API
ActiveMQ的這種特性主要關注跨語言跨技術的連接能力,我們為message broker提供了一個HTTP接口允許跨語言或者技術來進行簡單的發送和接受消息。使用HTTP POST將消息發送到message broker,使用HTTP GET從message broker獲取消息,使用URI并且指定參數來決定接受/發送的目的地。
4、系統架構
ActiveMQ內部實現采用的是分層和插件相結合的系統架構,從內到外一共可以分為三層,分別是JMS核心層、接口層和插件層。
JMS核心層:是JMS服務器端的實現,完整支持JMS1.1和J2EE1.4規范,可以部署到任何兼容J2EE1.4以上的J2EE容器上。
接口層: 對外提供接口。可以分為通信接口、消息保存接口和網絡服務接口三個子模塊。
通信接口負責網絡連接和消息傳輸,通過分布式命令模式解除了消息內容和通信載體的緊耦合關心,以便于消息在網絡中進行傳輸。它與各種協議插件一起完成消 息在JMS客戶端與服務器端和不同JMS之間的傳輸,由于插件應用層次的不同ActiveMQ擁有三種自底向下的網絡通信能力:TCP、UDP、SSL、 NIO、JATX等底層絡傳輸;OpenWire、Stomp Rest、WS Notification、XMPP、AMQP等標準協議鏈路;Java、C、C++、C#、Ruby、Perl、Python、PHP、AJAX等語言級交互通道。
消息保存接口可以支持內存、文件、內嵌數據庫和外部數據庫等四種消息持久化方式。
網絡服務接口是高級功能的接口,支持存儲轉發、集群、命令服務等。
插件層:由不同的 插件構成向外提供隊列、集群等服務。
5、核心數據流
JMS是發送消息的java中發送消息的中間件,包括5中數據流: ·
StreamMessage -- Java原始值的數據流 ·
MapMessage--一套名稱-值對 ·
TextMessage--一個字符串對象 ·
ObjectMessage--一個序列化的 Java對象 ·
BytesMessage--一個未解釋字節的數據流