訊息中介軟體之ActiveMQ

隱風發表於2022-02-21

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訊息模型

  1. Point-to-Point (P2P) /點對點

    image-20220220224711788

  2. Publish/Subscribe (Pub/Sub) /主題(釋出訂閱)

    image-20220220230555126

1.4 JMS的訊息結構

訊息頭、訊息屬性、訊息體

  1. 訊息頭

    image-20220220230826606

  2. 訊息屬性:可以理解為訊息的附加訊息頭,屬性名可以自定義

    image-20220220230935372

  3. 訊息體

    image-20220220231010881

2、ActiveMQ概念

2.1 定義

ActiveMQ是Apache出品,最流行的,能力強勁的開源訊息匯流排。

ActiveMQ是一個完全支援JMS1.1和J2EE 1.4規範的JMS Provider實現,儘管JMS規範出臺已經是很久的事情了,但是JMS在當今的J2EE應用中間仍然扮演著特殊的地位。

2.2 特性

  1. 支援多種程式語言
  2. 支援多種傳輸協議
  3. 有多種持久化方式

2.3 ActiveMQ支援哪些協議

  1. ActiveMQ支援多種協議傳輸和傳輸方式,允許客戶端使用多種協議連線。
  2. ActiveMQ支援的協議: AUTO、 OpenWire、 AMQP、Stomp、 MQTT等。
  3. 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.” 表示。

示例

image-20220220231926849

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的釋出訂閱模型

image-20220220232544323

2.5.2 MQTT服務質量

服務質量(QoS) 級別是一種關於傳送者和接收者之間資訊投遞的保證協議。MQTT中有三種QoS級別:

  1. 至多一次(0)
  2. 至少一次(1)
  3. 只有一次(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部署方式

共享同一個檔案系統

image-20220220234348440

共享同一個資料庫

image-20220220234418766

3.3 Broker-Cluster部署方式

image-20220220234556237

3.4 Master-Slave與Broker-Cluster相結合的部署方式

image-20220220234657847

4、ActiveMQ持久化機制

4.1 Queue型別的持久化機制

image-20220220235207879

4.2 Topic型別的持久化機制

image-20220220235251961

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型資料,佔用記憶體小。

特點

  1. 基於K-V儲存
  2. Key值有序儲存
  3. 操作介面簡單
  4. 支援資料快照
  5. 支援資料壓縮

L evelDB的結構

image-20220220235840522

ActiveMQ配置LevelDB:修改配置檔案${ACTIVEMQ_ HOME}/conf/activemq.xml

<persistenceAdapter>
	<levelDB directory="${activemq.data}/activemq-data"/>
</persistenceAdapter>

5、ActiveMQ事務實現機制

ActiveMQ事務實現的是最終一致性

生產者端實現機制如下:

消費者端實現機制如下:

2

相關文章