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管理頁面:
瀏覽器輸入 點選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的賬號密碼 -->
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Docker學習之搭建MySql容器服務DockerMySql
- 訊息佇列之 ActiveMQ佇列MQ
- 訊息中介軟體之ActiveMQMQ
- 溫故之訊息佇列ActiveMQ佇列MQ
- 常見訊息中介軟體之ActiveMQMQ
- ActiveMQ持久化訊息MQ持久化
- 利用redis的hash結構搭建訊息服務(發訊息,訂閱訊息,消費訊息,退訂)Redis
- docker搭建vsftpd服務DockerFTP
- Docker容器服務搭建(一)Docker
- Dubbo原始碼解析之服務端接收訊息原始碼服務端
- 從零講解搭建一個NIO訊息服務端服務端
- php ActiveMQ的傳送訊息,與處理訊息PHPMQ
- ActiveMQ支援的訊息協議MQ協議
- ActiveMQ 訊息資料持久化MQ持久化
- ActiveMQ + Camel 實現訊息路由MQ路由
- QNX學習 -- API之訊息傳遞API
- IOS學習之NSNotificationCenter訊息機制iOS
- 微服務學習計劃——訊息佇列微服務佇列
- Kafka學習之(七)搭建kafka視覺化服務Kafka EagleKafka視覺化
- ActiveMQ 中的訊息持久化(二)MQ持久化
- ActiveMQ 中的訊息持久化(一)MQ持久化
- 【PWA學習與實踐】(5)在Web中進行服務端訊息推送Web服務端
- 使用 docker 搭建 web 服務環境DockerWeb
- 訊息佇列ActiveMQ的使用詳解佇列MQ
- 深入理解訊息中介軟體技術之RabbitMQ服務MQ
- 分散式事務:基於可靠訊息服務分散式
- 阿里雲訊息服務使用教程阿里
- Storm概念學習系列之Stream訊息流 和 Stream Grouping 訊息流組ORM
- docker-compose搭建gitlab服務DockerGitlab
- ActiveMQ 中的訊息遊標(Message cursors)MQ
- RabbitMQ學習(三)之 “訊息佇列高階使用”MQ佇列
- 程式設計學習筆記之訊息地圖程式設計筆記地圖
- 死磕java底層(二)—訊息服務Java
- IOS 推送訊息 php做推送服務端iOSPHP服務端
- redis學習(七) 訊息通知Redis
- RocketMQ 學習歷程(一)——windows 上搭建rocketmq服務MQWindows
- RocketMQ 學習歷程(一)------windows 上搭建rocketmq服務MQWindows
- Dubbo原始碼學習之-服務匯出原始碼