Docker學習之搭建ActiveMQ消息服務

前言web

ActiveMQ 是Apache出品,最流行的,能力強勁的開源消息總線。ActiveMQ 是一個徹底支持JMS1.1和J2EE 1.4規範的 JMS Provider實現,儘管JMS規範出臺已是好久的事情了,可是JMS在當今的J2EE應用中間仍然扮演着特殊的地位。sql

在生產項目中,不少時候須要消息中間件來進行分佈式系統間的通訊。它具備低耦合、可靠投遞、廣播、流量控制、最終一致性等一系列功能。本篇主要介紹ActiveMQ 相關概念以及安裝說明,後面會着重介紹 SpringBoot 集成實現秒殺消息隊列。docker

概念數據庫

JMS消息模式瀏覽器

點對點或隊列模式bash

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

每一個消息只有一個消費者(Consumer),即一旦被消費,消息就再也不在消息隊列中session

發送者和接收者之間在時間上沒有依賴性,也就是說當發送者發送了消息以後,無論接收者有沒有正在運行,它不會影響到消息被髮送到隊列架構

接收者在成功接收消息以後需向隊列應答成功併發

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進入查看。

 

 

 

 

 

 

 

 

 

配置訪問密碼

進入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

歡迎工做一到五年的Java工程師朋友們加入Java架構開發: 855835163 羣內提供免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用本身每一分每一秒的時間來學習提高本身,不要再用"沒有時間「來掩飾本身思想上的懶惰!趁年輕,使勁拼,給將來的本身一個交代!

相關文章
相關標籤/搜索