當系統業務量不是太大(未到百萬千萬過億時),使用消息中間件ActiveMQ也可以,就簡要記錄下以前某治安監控系統用的ActiveMQ(可能當時版本有點老)。
1. 什麼是中間件
在介紹ActiveMQ之前,簡介介紹下什麼是中間件。
中間件是介於操作系統和在其上運行的應用程序之間的軟件。中間件實質上充當隱藏轉換層,實現了分佈式應用程序的通信和數據管理。它有時被稱爲管道,因爲它將兩個應用程序連接在一起,使數據和數據庫可在“管道”間輕鬆傳遞。 通過中間件,用戶可執行很多請求,例如在 Web 瀏覽器上提交表單,或者允許 Web 服務器基於用戶的配置文件返回動態網頁。
常見的中間件示例包括數據庫中間件、應用程序服務器中間件、面向消息的中間件、Web 中間件和事務處理監視器。每個程序通常都會提供消息傳遞服務,讓不同的應用程序可使用簡單對象訪問協議 (SOAP)、Web 服務、表述性狀態轉移 (REST) 和 JavaScript 對象表示法 (JSON) 等消息傳遞框架進行通信。雖然所有中間件都執行通信功能,但公司選用的類型將取決於要使用的服務以及需要傳達的信息類型。這可包括安全身份認證、事務管理、消息隊列、應用程序服務器、Web 服務器和目錄。中間件還可用於實時發生的操作的分佈式處理,而不是來回發送數據。
2. 常用中間件分類
2.1 數據庫中間件
MyCat、ShardingSphere
2.2 緩存中間件
Redis、Memcached
2.3 消息隊列中間件
消息隊列中間件(簡稱消息中間件)是指利用高效可靠的消息傳遞機制進行與平臺無關的數據交流,並基於數據通信來進行分佈式系統的集成。通過提供消息傳遞和消息排隊模型,它可以在分佈式環境下提供應用解耦、彈性伸縮、冗餘存儲、流量削峯、異步通信、數據同步等等功能,其作爲分佈式系統架構中的一個重要組件,有着舉足輕重的地位。
目前開源的消息中間件可謂是琳琅滿目,能讓大家耳熟能詳的就有很多,比如 ActiveMQ(本文要說的)、RabbitMQ、Kafka、RocketMQ、ZeroMQ。
ActiveMQ 是 Apache 出品的、採用 Java 語言編寫的完全基於 JMS1.1 規範的面向消息的中間件,爲應用程序提供高效的、可擴展的、穩定的和安全的企業級消息通信。
RabbitMQ 是採用 Erlang 語言實現的 AMQP 協議的消息中間件,最初起源於金融系統,用於在分佈式系統中存儲轉發消息。RabbitMQ 發展到今天,被越來越多的人認可,這和它在可靠性、可用性、擴展性、功能豐富等方面的卓越表現是分不開的。
Kafka 起初是由 LinkedIn 公司採用 Scala 語言開發的一個分佈式、多分區、多副本且基於 zookeeper 協調的分佈式消息系統,現已捐獻給 Apache 基金會。它是一種高吞吐量的分佈式發佈訂閱消息系統,以可水平擴展和高吞吐率而被廣泛使用。目前越來越多的開源分佈式處理系統如 Cloudera、Apache Storm、Spark、Flink 等都支持與 Kafka 集成。
RocketMQ 是阿里開源的消息中間件,目前已經捐獻個 Apache 基金會,它是由 Java 語言開發的,具備高吞吐量、高可用性、適合大規模分佈式系統應用等特點,經歷過雙 11 的洗禮,實力不容小覷。
ZeroMQ 號稱史上最快的消息隊列,基於 C 語言開發。ZeroMQ 是一個消息處理隊列庫,可在多線程、多內核和主機之間彈性伸縮,雖然大多數時候我們習慣將其歸入消息隊列家族之中,但是其和前面的幾款有着本質的區別,ZeroMQ 本身就不是一個消息隊列服務器,更像是一組底層網絡通訊庫,對原有的 Socket API 上加上一層封裝而已。
2.4 應用服務器中間件
tomcat、jboss、weblogic
2.5 web中間件
apache、nginx
2.6 事務中間件
Seata
暫且舉這麼多,沒有流行下來的就不管了!!!
3. 消息中間件ActiveMQ
3.1 背景介紹
3.1.1 java消息服務:
不同系統之間的信息交換,是我們開發中比較常見的場景,比如系統A要把數據發送給系統B,這個問題我們應該如何去處理? 1999年,原來的SUN公司領銜提出了一種面向消息的中間件服務--JMS規範(標準);常用的幾種信息交互技術(httpClient、hessian、dubbo、jms、webservice 五種).
3.1.2JMS概述:
JMS即Java消息服務(Java Message Service的簡稱),是Java EE 的標準/規範之一。這種規範(標準)指出:消息的發送應該是異步的、非阻塞的。也就是說消息的發送者發送完消息後就直接返回了,不需要等待接收者返回後才能返回,發送者和接收者可以說是互不影響。所以這種規範(標準)能夠減輕或消除系統瓶頸,實現系統之間去除耦合,提高系統的整體可伸縮性和靈活性。JMS只是Java EE中定義的一組標準API,它自身並不是一個消息服務系統,它是消息傳送服務的一個抽象,也就是說它定義了消息傳送的接口而並沒有具體實現。
3.1.3 ActiveMQ概述:
我們知道JMS只是消息服務的一組規範和接口,並沒有具體的實現,而ActiveMQ就是JMS規範的具體實現;它是Apache下的一個項目,採用Java語言開發;是一款非常流行的開源消息服務器.
3.1.4 ActiveMQ與JMS關係:
我們知道,JMS只是定義了一組有關消息傳送的規範和標準,並沒有真正實現,也就說JMS只是定義了一組接口而已;就像JDBC抽象了關係數據庫訪問、JPA抽象了對象與關係數據庫映射、JNDI抽象了命名目錄服務訪問一樣,JMS具體的實現由不同的消息中間件廠商提供,比如Apache ActiveMQ就是JMS規範的具體實現,Apache ActiveMQ纔是一個消息服務系統,而JMS不是。
3.2 ActiveMQ的使用
3.2.1 安裝ActiveMq
前提已安裝好jdk1.8https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html(自行百度),然後去官方http://archive.apache.org/dist/activemq/或http://activemq.apache.org/components/classic/download/下載activemq安裝包,選擇穩定版本
也可以通過命令行下載:
wget http://archive.apache.org/dist/activemq/5.15.9/apache-activemq-5.15.9-bin.tar.gz
然後解壓縮
tar zxf apache-activemq-5.15.9-bin.tar.gz
cd apache-activemq-5.15.9
創建服務用戶:
useradd activemq
chown -R activemq:activemq /dongguangming/apache-activemq-5.15.9
最後啓動服務
bin/activemq start
查看其運行狀態
bin/activemq status
可以通過web管理界面看效果http://192.168.8.200:8161/(ip地址依實際情況而改),默認用戶名admin,密碼admin
最後可以把activemq設置爲開機服務
創建服務文件
touch /etc/systemd/system/activemq.service
編輯該文件鍵入以下內容(注意activemq路徑按實際情況寫)
vi /etc/systemd/system/activemq.service
[Unit]
Description=Apache ActiveMQ Message Broker
After=network-online.target
[Service]
Type=forking
User=activemq
Group=activemq
WorkingDirectory=/dongguangming/apache-activemq-5.15.9/data
ExecStart=/dongguangming/apache-activemq-5.15.9/bin/activemq start
ExecStop=/dongguangming/apache-activemq-5.15.9/bin/activemq stop
Restart=on-abort
[Install]
WantedBy=multi-user.target
設置服務文件生效
# systemctl daemon-reload
# systemctl start activemq.service
# systemctl enable activemq.service
# systemctl status activemq.service
總之,ActiveMQ用途很廣泛,不管是業務場景還是集成到第三方工程框架。
參考軟文:
- 中間件 https://baike.baidu.com/item/%E4%B8%AD%E9%97%B4%E4%BB%B6/452240?fr=aladdin
-
中間件是什麼意思?中間件技術簡介 https://www.redhat.com/zh/topics/middleware/what-is-middleware
- 什麼是中間件?常見中間件有哪些? http://c.biancheng.net/view/3860.html
-
史上最全數據庫中間件詳解 https://www.sohu.com/a/336811296_505827
-
分佈式環境中怎麼選擇緩存中間件? https://www.sohu.com/a/294739348_100212268
-
IM系統的MQ消息中間件選型:Kafka還是RabbitMQ?https://zhuanlan.zhihu.com/p/37993013
-
分佈式事務中間件Seata的設計原理 https://www.sohu.com/a/326431135_661203,https://zhuanlan.zhihu.com/p/73263135
-
ActiveMQ的安裝和基本使用https://blog.51cto.com/mazongfei/2415479
-
CentOS 7下ActiveMQ安裝配置 https://linuxeye.com/474.html
-
消息中間件及ActiveMQ介紹 https://segmentfault.com/a/1190000014958916
- ActiveMQ使用筆記 http://www.360doc.com/content/14/0328/08/2795334_364337432.shtml
-
ActiveMQ---知識點整理 http://www.uml.org.cn/zjjs/201802111.asp
-
ActiveMQ 優化 https://www.w3cschool.cn/cuhkj/cuhkj-ld682658.html
-
ActiveMQ高級特性 https://www.iteye.com/blog/m635674608-2153359
-
ActiveMQ Redelivery Policy(消息重發策略) https://www.iteye.com/blog/isoftyh-1830288
-
ActiveMQ高可靠性解決方案 https://www.iteye.com/blog/kavy-2095822
-
How to Install Apache ActiveMQ on CentOS/RHEL 8
https://www.tecmint.com/install-apache-activemq-on-centos-rhel/
參考書籍:
- O'Reilly - Java Message Service https://github.com/dongguangming/java/blob/master/O'Reilly%20-%20Java%20Message%20Service.pdf
- ActiveMQ in Action https://github.com/dongguangming/java/blob/master/ActiveMQ%20in%20Action.pdf