什么是消息中間件(MQ)?
1.1 為什么會需要消息隊列(MQ)?
主要原因是由於在高並發環境下,由於來不及同步處理,請求往往會發生堵塞,比如說,大量的insert,update之類的請求同時到達MySQL,直接導致無數的行鎖表鎖,甚至最后請求會堆積過多,從而觸發too many connections錯誤。通過使用消息隊列,我們可以異步處理請求,從而緩解系統的壓力。
2.2 什么是消息中間件
消息中間件利用高效可靠的消息傳遞機制進行平台無關的數據交流,並基於數據通信來進行分布式系統的集成。通過提供消息傳遞和消息排隊模型,它可以在分布式環境下擴展進程間的通信。對於消息中間件,常見的角色大致也就有Producer(生產者)、Consumer(消費者)
常見的消息中間件產品:
(1)ActiveMQ
ActiveMQ 是Apache出品,最流行的,能力強勁的開源消息總線。ActiveMQ 是一個完全支持JMS1.1和J2EE 1.4規范的 JMS Provider實現。我們在本次課程中介紹 ActiveMQ的使用。
(2)RabbitMQ
AMQP協議的領導實現,支持多種場景。淘寶的MySQL集群內部有使用它進行通訊,OpenStack開源雲平台的通信組件,最先在金融行業得到運用。
(3)ZeroMQ
史上最快的消息隊列系統
(4)Kafka
Apache下的一個子項目 。特點:高吞吐,在一台普通的服務器上既可以達到10W/s的吞吐速率;完全的分布式系統。適合處理海量數據。
ActiveMQ
ActiveMQ是Apache的一個開源項目,它是一個能力強勁的開源消息總線,也是一個中間件產品。它是JMS的一個實現。
首先了解一下JMS
JMS(Java Messaging Service)是Java平台上有關面向消息中間件的技術規范,它便於消息系統中的Java應用程序進行消息交換,並且通過提供標准的產生、發送、接收消息的接口簡化企業應用的開發。
JMS是Java Message Service的簡稱,用來發送異步消息,在不同系統和不同的模塊之間我們可以利用它實現集成。
JMS有兩個好處:第一個就是讓模塊之間或者系統之間的耦合度降低,第二個是異步通信。
JMS本身只定義了一系列的接口規范,是一種與廠商無關的 API,用來訪問消息收發系統。它類似於 JDBC(java Database Connectivity):這里,JDBC 是可以用來訪問許多不同關系數據庫的 API,而 JMS 則提供同樣與廠商無關的訪問方法,以訪問消息收發服務。許多廠商目前都支持 JMS,包括 IBM 的 MQSeries、BEA的 Weblogic JMS service和 Progress 的 SonicMQ,這只是幾個例子。 JMS 使您能夠通過消息收發服務(有時稱為消息中介程序或路由器)從一個 JMS 客戶機向另一個 JML 客戶機發送消息。消息是 JMS 中的一種類型對象,由兩部分組成:報頭和消息主體。報頭由路由信息以及有關該消息的元數據組成。消息主體則攜帶着應用程序的數據或有效負載。
JMS 定義了五種不同的消息正文格式,以及調用的消息類型,允許你發送並接收以一些不同形式的數據,提供現有消息格式的一些級別的兼容性。
· TextMessage--一個字符串對象
· MapMessage--一套名稱-值對
· ObjectMessage--一個序列化的 Java 對象
· BytesMessage--一個字節的數據流
· StreamMessage -- Java 原始值的數據流
JMS的消息機制有2種模型,
一種是Point to Point,表現為隊列的形式。發送的消息,只能被一個接收者取走;
另一種是Topic,可以被多個訂閱者訂閱,類似於群發。
在JMS中有這樣幾個重要的核心接口和類:
ConnectionFactory:用於jms client獲取與jms provider的連接。不同的jms產品,對這個接口有不同的實現,比如說ActiveMQ,這個接口的實現類是ActiveMQConnectionFactory Connection:是由ConnectionFactory產生的,表示jms client與jms provider的連接 Session:是由Connection產生的,表示一個會話。Session是關鍵組件,Message、Producer/Consumer、Destination都是在Session上創建的 Message:這個組件很好理解,就是傳輸的消息,里面包括head、properties、body,其中head是必選的 Destination:是消息源,對發送者來說,就是消息發到哪里;對接收者來說,就是從哪里取消息。Destination有2個子接口,Queue和Topic,分別對應上面提到的2種模型 MessageProducer:是消息發送者 MessageConsumer:是消息接收者,和Message Producer是相反的一種組件
JMS有所了解之后,我們來看ActiveMQ
ActiveMQ特性
- 遵循JMS規范:ActiveMQ的各種特性是JMS1.1規范的實現。它們包括同步和異步消息傳遞,一次和只有一次的消息傳遞,對於預訂者的持久消息等等。依附於JMS規范意味着,不論JMS消息提供者是誰,同樣的基本特性都是有效的。
- 連接:ActiveMQ提供各種連接選擇,包括HTTP,HTTPS,IP多點傳送,SSL,STOMP,TCP,UDP,XMPP等。大量的連接協議支持使之具有更好的靈活性。
- 支持多種語言客戶端:ActiveMQ對多種語言提供客戶端API,除了Java之外還有C/C++、.NET、Perl、PHP、Ruby、Python等。這使得ActiveMQ能用在Java之外的其它語言中。很多其它語言都可以通過ActiveMQ提供的客戶端API使用ActiveMQ的全部特性。當然,ActiveMQ代理器(broker)仍然是運行在java虛擬機上,但是客戶端能夠使用其它的被支持的語言。
- 可插拔的持久性和安全:ActiveMQ提供多種持久性方案可供選擇,也可以完全按自己需求定制驗證和授權。例如,ActiveMQ通過KahaDB提供自己的超快速消息持久方案(ultra-fast message persistence),但也支持標准的JDBC方案。ActiveMQ可以通過配置文件提供簡單的驗證和授權,也提供標准的JAAS登陸模塊。
- 簡單的管理:ActiveMQ是為開發者設計的。它並不需要專門的管理工具,因為它提供各種易用且強大的管理特性。有很多方法去監控ActiveMQ的各個方面,可以通過JMX使用JConsole或ActiveMQ web console;可以運行ActiveMQ消息報告;可以用命令行腳本;可以通過日志。
- 支持集群:為了利於擴展,多個ActiveMQ broker能夠聯合工作。這個方式就是network of brokers並且能支持多種拓撲結構。
ActiveMQ的安裝
- 將AMQ的tar包上傳至指定文件夾(如:/home/cspgs)
- 進入部署目錄,解壓文件(我這里的部署路徑是/home/cspgs)
命令:tar -zxvf apache-activemq-5.12.1-bin.tar.gz
並將解壓后的目錄名改為activemq
命令:mv apache-activemq-5.12.1 activemq
為了能夠使用JMX監控遠程的ActiveMQ,我們需要對ActiveMQ進行配置,以使JMX能夠正確連接到遠程的ActiveMQ監控服務。
- 進入activemq目錄,修改conf目錄下的activemq.xml文件,修改2個地方
命令:vi conf/activemq.xml
(1)修改broker屬性中的字段,添加 useJmx= "true"
修改后:
(2)在文件中將managementContext的內容修改為下面的內容
<managementContext> <managementContext createConnector="true" connectorPort="11099" /> </managementContext>
默認:
- 查看端口是否被占用
Activemq有這幾個端口,分別是:
conf目錄的activemq.xml的5個端口
以及conf目錄下jetty.xml的1個端口
查看端口是否被占用命令,xxx為端口:
netstat -apn | grep xxx
端口被占用如下:
LISTEN那一行,表示被占用。
LISTENING並不表示端口被占用,不要和LISTEN混淆哦,查看具體端口時候,必須要看到tcp,端口號,LISTEN那一行,才表示端口被占用了
- 進入ActiveMQ啟動目錄下
命令:cd bin/linux-x86-64
- 啟動ActiveMQ,並查看進程,amq啟動后會有2個進程
命令:./activemq start
查看進程:ps -ef | grep activemq
- 檢驗ActiveMQ是否啟動成功
在瀏覽器輸入url地址:http://ip:8161/admin
比如:我的地址是:http://192.168.80.72:8161/admin
有的訪問需要用戶和密碼:admin/admin

出現這個頁面表示已經啟動成功。
- 如果activemq沒有啟動成功,查看日志文件,分析原因具體解決,日志文件位於logs目錄下的activemq.log文件
-
IPv6配置更改不需要更改任何配置信息。
-
IPv6應用連接
程序連接地址需要修改為IPv6地址
flow.queue.url=tcp://[fd15:4ba5:5a2b:1008:20c:29ff:fe45:98c7]:61616
-
驗證IPv6過程
用IPv6地址訪問ActiveMQ,訪問成功。
瀏覽器訪問地址:http://[fd15:4ba5:5a2b:1008:20c:29ff:fe45:98c7]:8161/admin/