一、概述
1. 概念
什麼是中間件?
非底層操作系統軟件/業務應用軟件,不直接給最終用戶使用,不能直接爲客戶提供價值的軟件。
什麼是消息中間件?
關注於數據的發送和接收,利用高效可靠的異步消息傳遞機制集成分佈式系統。
什麼是JMS?
JMS(Java Message Service)是一個Java平臺中面向消息中間件的API,用於在兩個應用程序之間或分佈式系統中發送消息,進行異步通信。
什麼是AMQP?
AMQP(Advanced Message Queuing Protocol)是提供統一消息服務的應用層標準協議,基於此協議的客戶端和消息中間件可傳遞消息,不受客戶端/中間件不同產品不同開發語言等條件限制。
2. 優點
消息中間件爲應用系統提供高效、靈活的消息同步和異步傳輸處理、存儲轉發、可靠傳輸。
優點:
系統解耦;異步;橫向擴展;安全可靠;可以實現順序保證。
但與AMQP相比,跨平臺支持較差。
3. 常見消息中間件服務器
ActiveMQ
Apache出品最流行強勁的開源消息總線,完全支持JMS 1.1和J2EE 1.4規範的JMS Provider實現。
特性:
多種語言和協議編寫客戶端;完全支持JMS 1.1和J2EE 1.4規範(持久化,XA消息,事務);支持虛擬主題、組合目的、鏡像隊列
RabbitMQ
開源的AMQP實現,服務器端用Erlang語言編寫,用於在分佈式系統中存儲轉發消息,具有易用性、擴展性、高可用性。
特性:
支持多種客戶端;AMQP完整實現(vhost,Exchange,Binding等);事務特性/發佈確認;消息持久化。
Kafka
高吞吐量的分佈式發佈訂閱消息系統,是分佈式、分區、可靠的分佈式日誌存儲服務(對消息順序要求嚴格),通過一種獨特的設計提供了消息系統的功能(並不算嚴格的消息中間件)。
特性:
通過O(1)的磁盤數據結構提供消息持久化,即使是對於TB的消息存儲也能保持長時間的穩定性能;高吞吐量,即使是普通硬件也可能達到百萬/秒的消息;分區、消費者分組。
ActiveMQ適合中小企業級消息應用場景,不適用於上千隊列應用場景;RabbitMQ適合穩定性要求高的企業級應用(金融);Kafka適用於大數據日誌處理或對實時性(少量延遲)、可靠性要求稍低的應用場景。
4. JMS規範
JMS概念:
提供者:實現JMS規範的消息中間件服務器
客戶端:發送/接受消息的應用程序
生產者/發佈者:創建併發送消息的客戶端
消費者/訂閱者:接受並處理消息的客戶端
消息模式:在客戶端之間傳遞消息的方式,JMS中定義了主題和隊列兩種方式。
JMS消息模式:
(1)、隊列模型:客戶端包括生產者、消費者;隊列中的消息只能被一個消費者消費;消費者可以隨時消費隊列中的消息。
(2)、主題模式:客戶端包括髮布者、訂閱者;主題中的消息會被所有訂閱者消費;消費者不能消費訂閱前發送到主題中的消息。
JMS編碼接口:
ConnectionFactory:用於創建連接到消息中間件的連接工廠
Connection:應用程序與消息服務器之間的通信鏈路
Destination:消息發佈和接受的地點,包括隊列或主題
Session:單線程上下文,用於發送和接受消息
MessageConsumer:由會話創建,用於接收發送到目標的消息
MessageProducer:由會話創建,發送消息到目標
Message:在生產者消費者間傳送的對象,一般由消息頭、消息屬性、消息體組成。
二、JMS簡單使用
下載ActiveMQ後,進行解壓,在bin目錄下win32/win64中找到以管理員方式運行InstallService.bat,然後訪問網址localhost:8161可查看ActiveMQ是否安裝成功。
1. 隊列模式
創建項目,引入解壓包下的activemq-all-5.15.0.jar到項目中,進行編碼開發:
在剛剛那個網站上可以看到使用隊列模式生成的十條消息
編寫消費者,和生產者代碼大致相同:
開啓了兩個消費者,可以看到在隊列模式下一條消息只供一個消費者消費,兩個消費者獲取消息幾乎是均勻獲取(因爲十條消息太少,所以增加到了二十條,只是修改了生產者for循環中的停止條件)。
2. 主題模式
代碼幾乎和隊列模式幾乎完全相同,只需要修改一下部分:
Destination destination=new ActiveMQTopic(topicName);
開啓了兩個消費者,可以看到在主題模式下消費者必須在發佈者之前啓動(訂閱),一條消息供多個消費者使用(貌似懶得連類名都沒有改,哈哈哈哈哈嗝)。