消息中間件之ActiveMQ
1、JMS(Java Message Service,Java消息服務)
1.1 定義
Java消息服務(Java Message Service,即JMS)應用程式介面是一個Java平台中關於面向消息中間件(MOM) 的API, 用於在兩個應用程式之間,或分散式系統中發送消息,進行非同步通訊。Java消息服務是一個與具體平台無關的APl。
1.2 JMS的對象模型
名稱 | 描述 |
---|---|
ConnectionFactory | 連接工廠 |
Connection | 連接 |
Session | 會話 |
Destination | 目的 |
MessageProducer | 生產者 |
MessageConsumer | 消費者 |
Message | 消息 |
Broker | 消息中間件的實例(ActiveMQ) |
1.3 JMS消息模型
-
Point-to-Point (P2P) /點對點
-
Publish/Subscribe (Pub/Sub) /主題(發布訂閱)
1.4 JMS的消息結構
消息頭、消息屬性、消息體
-
消息頭
-
消息屬性:可以理解為消息的附加消息頭,屬性名可以自定義
-
消息體
2、ActiveMQ概念
2.1 定義
ActiveMQ是Apache出品,最流行的,能力強勁的開源消息匯流排。
ActiveMQ是一個完全支援JMS1.1和J2EE 1.4規範的JMS Provider實現,儘管JMS規範出台已經是很久的事情了,但是JMS在當今的J2EE應用中間仍然扮演著特殊的地位。
2.2 特性
- 支援多種程式語言
- 支援多種傳輸協議
- 有多種持久化方式
2.3 ActiveMQ支援哪些協議
- ActiveMQ支援多種協議傳輸和傳輸方式,允許客戶端使用多種協議連接。
- ActiveMQ支援的協議: AUTO、 OpenWire、 AMQP、Stomp、 MQTT等。
- ActiveMQ支援的基礎傳輸方式: VM、 TCP、SSL、 UDP 、Peer、 Multicast、 HTTP(S)等,以及更高級的Failover、Fanout、 Discovery、 ZeroConf方式。
2.4 OpenWire協議
2.4.1 OpenWire協議是什麼
OpenWire是Apache的一種跨語言的協議,允許從不同的語言和平台訪問ActiveMQ,是ActiveMQ 4.x以後的版本默認的傳輸協議。
2.4.2 OpenWire協議如何使用
OpenWire 支援TCP、SSL、 NIO、UDP、VM等傳輸方式,直接配置這些連接,就是使用的OpenWire協議,OpenWire有 自己的配置參數,客戶端和伺服器端配置的參數名都通過綴「wireFormat.」 表示。
示例
OpenWire的配置參數說明
屬性 | 默認值 | 描述 |
---|---|---|
stackTraceEnabled | true | 是否應該把已經發生並且跟蹤到的堆棧異常,通過Broker發送到客戶端 |
tcpNoDelayEnabled | true | socket的NoDelay參數 |
cacheEnabled | true | 如果不斷重複的值進行快取,以便少編組(馬上要進行的發送)發生 |
tightEncodingEnabled | true | 根據CPU使用情況,自動調整傳輸內容大小(壓縮比例) |
prefixPacketSize | true | 在每個包被編組前(馬上要被發送),每個包的大小是否應該作為前綴連接的最大空閑時間,以毫秒為單位。 |
maxInactivityDuration | 30000 | broker服務會根據配置關閉超時的連接。同時也可以通過心跳機制來保持連接。值<=0則禁用活動連接的監測。 |
maxlnactivityDurationInitalDelay | 10000 | 連接建立之後,多久開始進行超時檢測 |
cacheSize | 1024 | 如果能被快取,那麼這個規定了快取的最大數量。此屬性中在ActiveMQ的4.1中開始添加使用可發送最大幀大小 |
maxFrameSize | MAX_ LONG | 可以幫助防止OOM DOS攻擊 |
2.5 為什麼使用MQTT協議
MQTT的結構簡單,相對於其它消息協議,它更加輕量級。適合在計算能力有限、低頻寬、不可靠的網路環境使用。
2.5.1 MQTT的發布訂閱模型
2.5.2 MQTT服務品質
服務品質(QoS) 級別是一種關於發送者和接收者之間資訊投遞的保證協議。MQTT中有三種QoS級別:
- 至多一次(0)
- 至少一次(1)
- 只有一次(2)
QoS是MQTT的一個主要功能,它使得在不可靠的網路下進行通訊變得更為簡單,因為即便是在非常不可靠的網路下,協議也可以掌控是否需要重發消息並保證消息到達。它也能幫助客戶端根據網路環境和程式邏輯來自由選擇QoS.
2.5.3 ActiveMQ中如何使用MQTT協議
ActiveMQ 伺服器端配置
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize= 104857600"/>
</transportConnectors>
MQTT配置參數說明
屬性 | 默認值 | 描述 |
---|---|---|
maxFrameSize | 268435456 | (v5.12.0)可以發送的最大幀大小。協議限制為256MB,其值不能設置得更高。可以幫助防止OOM DOS攻擊 |
配置示例
<transportConnector name="mqtt" uri="mtt://localhost:1883?wireFormat.maxFrameSize=100000"/>
MQTT使用NIO
<transportConnector name="mgtt+nio" uri="mtt+nio://localhost:1883"/>
MQTT使用NIO + SSL
<transportConnector name="mqtt+nio" uri="mqtt+niossl://localhost:1883"/>
2.5.4 Spring使用MQTT
Spring Integration提供了MQTT協議的支援,通過Maven添加依賴即可使用。
<dependency>
<groupld>org.springframework.integration</groupld>
<artifactld>spring-integration-mqtt</artifactld>
<version>5.1.1.RELEASE</version>
</dependency>
2.6 AUTO協議是什麼
AUTO自動檢測協議從ActiveMQ 5.13.0開始,ActiveMQ 開始支援協議格式檢測,可以自動檢測OpenWire、STOMP、 AMQP和MQTT。允許這4種類型的客戶端共享一個傳輸
AUTO使用TCP
<transportConnector name="auto" uri="auto://localhost:5671"/>
AUTO使用SSL
<transportConnector name="auto+ssl" uri="autssl://localhost:5671"/>
AUTO使用NIO
<transportConnector name="auto+nio" uri="auto+nio://localhost:5671"/>
AUTO使用NIO+SSL
<transportConnector name="auto+nio+ssl" uri="auto+nioss://localhost:5671"/>
3、ActiveMQ高可用集群方案
3.1 ActiveMQ有哪些集群部署方式
Master-Slave部署方式 | Broker-Cluster部署方式 | Master-Slave與Broker-Cluster相結合的部署方式 |
---|
3.2 Master-Slave部署方式
共享同一個文件系統
共享同一個資料庫
3.3 Broker-Cluster部署方式
3.4 Master-Slave與Broker-Cluster相結合的部署方式
4、ActiveMQ持久化機制
4.1 Queue類型的持久化機制
4.2 Topic類型的持久化機制
4.3 存儲方式
4.3.1 JDBC方式
將消息存儲到資料庫中,例如: Mysql、 SQL Server、Oracle、 DB2等
優點 | 缺點 |
---|---|
方便管理 | 性能低 |
可以支援強一致性 | / |
4.3.2 AMQ方式
基於文件的存儲方式,它具有寫入速度快和容易恢復的特點,但是由於其重建索引時間過長,而且索引文件佔用磁碟空間過大,所以已經不推薦使用。
優點 | 缺點 |
---|---|
性能高於JDBC | 索引佔用磁碟空間量大 |
/ | 重建索引速度非常慢 |
4.3.3 LevelDB方式
LevelDB是Google開發的一套用於持久化數據的高性能類庫.LevelDB並不是一-種服務,用戶需要自行實現Server。是單進程的服務,能夠處理十億級別規模Key-Value型數據,佔用記憶體小。
特點
- 基於K-V存儲
- Key值有序存儲
- 操作介面簡單
- 支援數據快照
- 支援數據壓縮
L evelDB的結構
ActiveMQ配置LevelDB:修改配置文件${ACTIVEMQ_ HOME}/conf/activemq.xml
<persistenceAdapter>
<levelDB directory="${activemq.data}/activemq-data"/>
</persistenceAdapter>
5、ActiveMQ事務實現機制
ActiveMQ事務實現的是最終一致性
生產者端實現機制如下:
消費者端實現機制如下: