Docker學習之搭建ActiveMQ訊息服務
前言
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管理頁面:
瀏覽器輸入 http://ip :8162 點選Manage ActiveMQ broker使用預設賬號/密碼:admin/admin進入檢視。
圖片描述(最多50字)
圖片描述(最多50字)
配置訪問密碼
進入Docker容器:
docker exec -it myactivemq /bin/bash
控制檯介面設定使用者名稱和密碼:
位於根目錄 conf 目錄下
vi jetty-realm.properties
修改密碼
username: password [,rolename ...]
admin: admin, admin
配置連線密碼
編輯activemq.xml檔案,放置到 shutdownHooks 下方即可。