什麼是消息中間件
消息中間件顧名思義實現的就是在兩個系統或兩個客戶端之間進行消息傳送。
什麼是ActiveMQ
ActiveMQ是一種開源的基於JMS(Java Message Servie)規範的一種消息中間件的實現,ActiveMQ的設計目標是提供標準的,面向消息的,能夠跨越多語言和多系統的應用集成消息通信中間件。
什麼時候需要用ActiveMQ
ActiveMQ常被應用與系統業務的解耦,異步消息的推送,增加系統併發量,提高用戶體驗。例如以我在工作中的使用,在比較耗時且異步的遠程開鎖操作時。
如何使用ActiveMQ
1.AcitveMQ的數據傳送流程
2.ActiveMQ的兩種消息傳遞類型
(1)點對點模式
- 每個消息只有一個消費者(Consumer),即一旦被消費,消息就不再在消息隊列中。
- 發送者和接收者之間在時間上沒有依賴性,也就是說當發送者發送了消息之後,不管接收者有沒有正在運行,它不會影響到消息被髮送到隊列。
- 接收者在成功接收消息之後需向隊列應答成功。
(2)基於發佈/訂閱模式
包含三個角色:主題(Topic),發佈者(Publisher),訂閱者(Subscriber) 。多個發佈者將消息發送到Topic,系統將這些消息傳遞給多個訂閱者。
- 每個消息可以有多個消費者
- 發佈者和訂閱者之間有時間上的依賴性。針對某個主題(Topic)的訂閱者,它必須創建一個訂閱者之後,才能消費發佈者的消息。
- 爲了消費消息,訂閱者必須保持運行的狀態。
爲了緩和這樣嚴格的時間相關性,JMS允許訂閱者創建一個可持久化的訂閱。這樣,即使訂閱者沒有被激活(運行),它也能接收到發佈者的消息。
如果希望發送的消息可以不被做任何處理、或者只被一個消息者處理、或者可以被多個消費者處理的話,那麼可以採用Pub/Sub模型。
兩種消息傳遞類型的不同,點對點傳輸消費者可以接收到在連接之前生產者所推送的數據,而基於發佈/訂閱模式的傳輸方式消費者只能接收到連接之後生產者推送的數據。
集羣方案(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等待;
ActiveMQ部署
1.查找activemq鏡像
[root@test2 ~]# docker search activemq
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
webcenter/activemq ActiveMQ 5.14.3 with OpenJDK-jre-8-headless … 173 [OK]
rmohr/activemq Various versions of ActiveMQ neatly packet i… 118 [OK]
vromero/activemq-artemis ActiveMQ Artemis image (Debian and Alpine ba… 29
2.拉取activemq鏡像
[root@test2 ~]# docker pull webcenter/activemq
Using default tag: latest
latest: Pulling from webcenter/activemq
7dcf5a444392: Downloading [==================> ] 18.68MB/51.07MB
9eebba75a87f: Download complete
1f0440d87cc7: Download complete
dacd0555c1b4: Download complete
b0f19aa05a94: Downloading [===========================================> ] 48.25MB/55.76MB
4796f64423b2: Downloading [====> ] 1.973MB/24.05MB
5d994b710cb9: Waiting
[root@test2 ~]# docker images
webcenter/activemq latest 3af156432993 3 years ago 422MB
3.運行activemq容器
61616
是 activemq 的容器使用端口,8161
是 web 頁面管理端口
-d:後臺運行容器
--name:指定容器名
-p:指定服務運行的端口(61616:應用訪問端口;8161:控制檯Web端口號)
webcenter/activemq:鏡像名
[root@test2 ~]# docker run -itd --name activemq -p 61616:61616 -p 8161:8161 webcenter/activemq
6f3ad16a8abdfa16eea6e86cf096061da1118c9d648d2ab84600fe24d987def4
[root@test2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6f3ad16a8abd webcenter/activemq "/app/run.sh" 4 minutes ago Up 3 minutes 1883/tcp, 5672/tcp, 0.0.0.0:8161->8161/tcp, 61613-61614/tcp, 0.0.0.0:61616->61616/tcp activemq
[root@test2 ~]# ss -antulp | grep :61616
tcp LISTEN 0 128 :::61616 :::* users:(("docker-proxy",pid=81001,fd=4))
[root@test2 ~]# ss -antulp | grep :8161
tcp LISTEN 0 128 :::8161 :::* users:(("docker-proxy",pid=81013,fd=4))
4.查看ActiveMQ容器進程信息
[root@test2 ~]# docker top activemq
UID PID PPID C STIME TTY TIME CMD
root 81039 81019 0 17:29 pts/0 00:00:01 /usr/bin/python /usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
root 81079 81039 0 17:29 pts/0 00:00:00 /usr/sbin/cron -f
root 81080 81039 0 17:29 pts/0 00:00:00 sh -c "/usr/bin/java" -Xms64M -Xmx1G -Djava.util.logging.config.file=logging.properties -Djava.security.auth.login.config=/opt/activemq/conf.tmp/login.config -Dcom.sun.management.jmxremote -Djava.awt.headless=true -Djava.io.tmpdir="/opt/activemq//tmp" -Dactivemq.classpath="/opt/activemq/conf.tmp:/opt/activemq//../lib/:" -Dactivemq.home="/opt/activemq/" -Dactivemq.base="/opt/activemq/" -Dactivemq.conf="/opt/activemq/conf.tmp" -Dactivemq.data="/data/activemq" -jar "/opt/activemq//bin/activemq.jar" start ;
root 81123 81080 14 17:29 pts/0 00:01:05 /usr/bin/java -Xms64M -Xmx1G -Djava.util.logging.config.file=logging.properties -Djava.security.auth.login.config=/opt/activemq/conf.tmp/login.config -Dcom.sun.management.jmxremote -Djava.awt.headless=true -Djava.io.tmpdir=/opt/activemq//tmp -Dactivemq.classpath=/opt/activemq/conf.tmp:/opt/activemq//../lib/: -Dactivemq.home=/opt/activemq/ -Dactivemq.base=/opt/activemq/ -Dactivemq.conf=/opt/activemq/conf.tmp -Dactivemq.data=/data/activemq -jar /opt/activemq//bin/activemq.jar start
修改訪問密碼
[root@test2 ~]# docker exec -it activemq /bin/bash
root@6f3ad16a8abd:/opt/activemq# ls
LICENSE README.txt bin conf.tmp docs lib webapps
NOTICE activemq-all-5.14.3.jar conf data examples tmp webapps-demo
root@6f3ad16a8abd:/opt/activemq# vim conf.tmp/jetty-realm.properties
...
# Defines users that can access the web (console, demo, etc.)
# username: password [,rolename ...]
admin: admin, admin //修改密碼
user: user, user
配置連接密碼
編輯activemq.xml文件,配置放到 shutdownHooks 下方。
root@6f3ad16a8abd:/opt/activemq# vim conf.tmp/activemq.xml
...
121 <shutdownHooks>
122 <bean xmlns="http://www.springframework.org/schema/beans" class="org.apache.activemq.hooks.SpringContextHook" / >
123 </shutdownHooks>
<!-- 此處添加訪問ActiveMQ的賬號密碼 -->
<plugins>
<simpleAuthenticationPlugin>
<users>
<authenticationUser username="${activemq.username}" password="${activemq.password}" groups="users,admins"/>
</users>
</simpleAuthenticationPlugin>
</plugins>
...
||
||
root@6f3ad16a8abd:/opt/activemq# vim conf.tmp/credentials.properties
# Defines credentials that will be used by components (like web console) to access the broker
activemq.username=system //修改用戶
activemq.password=manager //修改密碼
guest.password=password
訪問ActiveMQ控制檯
默認賬號/密碼:admin/admin
8161
是 web 頁面管理端口