Docker學習之搭建ActiveMQ訊息服務

firefule發表於2021-09-09

圖片描述

前言

ActiveMQ 是Apache出品,最流行的,能力強勁的開源訊息匯流排。ActiveMQ 是一個完全支援JMS1.1和J2EE 1.4規範的 JMS Provider實現,儘管JMS規範出臺已經是很久的事情了,但是JMS在當今的J2EE應用中間仍然扮演著特殊的地位。

在生產專案中,很多時候需要訊息中介軟體來進行分散式系統間的通訊。它具有低耦合、可靠投遞、廣播、流量控制、最終一致性等一系列功能。本篇主要介紹ActiveMQ 相關概念以及安裝說明,後面會著重介紹 SpringBoot 整合實現秒殺訊息佇列。

概念

JMS訊息模式

點對點或佇列模式

包含三個角色:訊息佇列(Queue),傳送者(Sender),接收者(Receiver)。每個訊息都被髮送到一個特定的佇列,接收者從佇列中獲取訊息。佇列保留著訊息,直到他們被消費或超時。

  • 每個訊息只有一個消費者(Consumer),即一旦被消費,訊息就不再在訊息佇列中
  • 傳送者和接收者之間在時間上沒有依賴性,也就是說當傳送者傳送了訊息之後,不管接收者有沒有正在執行,它不會影響到訊息被髮送到佇列
  • 接收者在成功接收訊息之後需向佇列應答成功

Pub/Sub 釋出/訂閱模式

包含三個角色:主題(Topic),釋出者(Publisher),訂閱者(Subscriber) 。多個釋出者將訊息傳送到Topic,系統將這些訊息傳遞給多個訂閱者。

  • 每個訊息可以有多個消費者
  • 釋出者和訂閱者之間有時間上的依賴性。針對某個主題(Topic)的訂閱者,它必須建立一個訂閱者之後,才能消費釋出者的訊息。
  • 為了消費訊息,訂閱者必須保持執行的狀態。

為了緩和這樣嚴格的時間相關性,JMS允許訂閱者建立一個可持久化的訂閱。這樣,即使訂閱者沒有被啟用(執行),它也能接收到釋出者的訊息。

如果希望傳送的訊息可以不被做任何處理、或者只被一個訊息者處理、或者可以被多個消費者處理的話,那麼可以採用Pub/Sub模型。

JMS訊息基本元件

ConnectionFactory

建立Connection物件的工廠,針對兩種不同的jms訊息模型,分別有QueueConnectionFactory和TopicConnectionFactory兩種。可以透過JNDI來查詢ConnectionFactory物件。

Destination

Destination的意思是訊息生產者的訊息傳送目標或者說訊息消費者的訊息來源。對於訊息生產者來說,它的Destination是某個佇列(Queue)或某個主題(Topic);對於訊息消費者來說,它的Destination也是某個佇列或主題(即訊息來源)。
所以,Destination實際上就是兩種型別的物件:Queue、Topic可以透過JNDI來查詢Destination。

Connection

Connection表示在客戶端和JMS系統之間建立的連結(對TCP/IP socket的包裝)。Connection可以產生一個或多個Session。跟ConnectionFactory一樣,Connection也有兩種型別:QueueConnection和TopicConnection。

Session

Session是操作訊息的介面。可以透過session建立生產者、消費者、訊息等。Session提供了事務的功能。當需要使用session傳送/接收多個訊息時,可以將這些傳送/接收動作放到一個事務中。同樣,也分QueueSession和TopicSession。

訊息的生產者

訊息生產者由Session建立,並用於將訊息傳送到Destination。同樣,訊息生產者分兩種型別:QueueSender和TopicPublisher。可以呼叫訊息生產者的方法(send或publish方法)傳送訊息。

訊息消費者

訊息消費者由Session建立,用於接收被髮送到Destination的訊息。兩種型別:QueueReceiver和TopicSubscriber。可分別透過session的createReceiver(Queue)或createSubscriber(Topic)來建立。當然,也可以session的creatDurableSubscriber方法來建立持久化的訂閱者。

MessageListener

訊息監聽器。如果註冊了訊息監聽器,一旦訊息到達,將自動呼叫監聽器的onMessage方法。EJB中的MDB(Message-Driven Bean)就是一種MessageListener。

Transport傳輸方式

ActiveMQ目前支援的Transport有:VM Transport、TCP Transport、NIO Transport、SSL Transport、Peer Transport、UDP Transport、Multicast Transport、HTTP and HTTPS Transport、WebSockets Transport、Failover Transport、Fanout Transport、Discovery Transport、ZeroConf Transport等。

  • VM Transport:允許客戶端和Broker直接在VM內部通訊,採用的連線不是Socket連線,而是直接的方法呼叫,從而避免了網路傳輸的開銷。應用場景也僅限於Broker和客戶端在同一JVM環境下。

  • TCP Transport:客戶端透過TCP Socket連線到遠端Broker。配置語法:

  • tcp://hostname:port?transportOptions

  • HTTP and HTTPS Transport:允許客戶端使用REST或者Ajax的方式進行連線。這意味著可以直接使用Javascript向ActiveMQ傳送訊息。

  • WebSockets Transport:允許客戶端透過HTML5標準的WebSockets方式連線到Broker。

  • Failover Transport:青龍系統MQ採用的就是這種連線方式。這種方式具備自動重新連線的機制,工作在其他Transport的上層,用於建立可靠的傳輸。允許配置任意多個的URI,該機制將會自動選擇其中的一個URI來嘗試連線。配置語法:

  • failover:(tcp://localhost:61616,tcp://localhost:61617,…)?transportOptions

  • Fanout Transport:主要適用於生產訊息發向多個代理。如果多個代理出現環路,可能造成消費者接收重複的訊息。所以,使用該協議時,最好將訊息傳送給多個不相連線的代理。

Persistence持久化儲存

AMQ Message Store

ActiveMQ 5.0 的預設持久化儲存方式。

Kaha Persistence

這是一個專門針對訊息持久化的解決方案。它對典型的訊息使用模式進行了最佳化。

JDBC Persistence

目前支援的資料庫有:Apache Derby, Axion, DB2, HSQL, Informix, MaxDB, MySQL, Oracle, Postgresql, SQLServer, Sybase。

Disable Persistence

不應用持久化儲存。

叢集方案(Master / Slave)

Pure Master Slave

  • 無單點故障;

  • 不需要依賴共享檔案系統或是共享資料庫,使用 KahaDB的方式持久化儲存;

  • 一個Master只能帶一個Slave;

  • Master工作期間,會將訊息狀況自動同步到Slave;

  • Master一旦崩潰,Slave自動接替其工作,已傳送並尚未消費的訊息繼續有效;

  • Slave接手後,必須停止Slave才能重啟先前的Master;

Shared File System Master Slave

JDBC Master Slave

  • 配置上,不存在Master和Slave的區分,多個共享資料來源的Broker構成JDBC Master Slave;

  • 首先搶到資源(資料庫鎖)的Broker成為Master,其他Broker定期嘗試搶佔資源;

  • 一旦Master崩潰,其他Broker搶佔資源,最終只有一臺搶到,立刻成為Master,之前的Master即便重啟成功,也只能作為Slave等待;

安裝說明

這裡使用Docker安裝,查詢Docker映象:

docker search activemq

下載Docker映象:

docker pull webcenter/activemq

建立&執行ActiveMQ容器:

docker run -d --name myactivemq -p 61617:61616 -p 8162:8161 webcenter/activemq

61616是 activemq 的容器使用埠(對映為61617),8161是 web 頁面管理埠(對外對映為8162)

檢視建立的容器,如果存在說明安裝成功:

docker ps

檢視WEB管理頁面:

瀏覽器輸入 點選Manage ActiveMQ broker使用預設賬號/密碼:admin/admin進入檢視。

圖片描述

圖片描述

配置訪問密碼

進入Docker容器:

docker exec -it myactivemq /bin/bash

控制檯介面設定使用者名稱和密碼:

# 位於根目錄 conf 目錄下
vi jetty-realm.properties

# 修改密碼
# username: password [,rolename ...]
admin: admin, admin

配置連線密碼

編輯activemq.xml檔案,放置到 shutdownHooks 下方即可。

<!-- 新增訪問ActiveMQ的賬號密碼 --&gt
plugins>
	simpleAuthenticationPlugin>
		users>
			authenticationUser username="${activemq.username}" password="${activemq.password}" groups="users,admins"/>
		users>
	simpleAuthenticationPlugin>
plugins>

修改conf中credentials.properties檔案進行密碼設定:

activemq.username=admin
activemq.password=123456
guest.password=123456

注意事項

如果是雲伺服器,記得開放相關埠(61617/8160)

參考

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1834/viewspace-2815000/,如需轉載,請註明出處,否則將追究法律責任。

相關文章