1. 什么是連接器
在ActiveMQ中有3個重要的角色:Broker、Producer、Consumer柱嫌。
Broker為消息代理,它是ActiveMQ服務端角色屯换,接受客戶端的連接并提供消息通信的核心服務慎式。
Producer是消息生產者,客戶端角色趟径。
Consumer是消息消費者瘪吏,客戶端角色。
客戶端怎樣和服務端通信蜗巧,該選擇哪種網絡協(xié)議掌眠?ActiveMQ定義的連接器(connector
)就是用來約定ActiveMQ的節(jié)點之間如何通信
。
2. 連接器分類
在ActiveMQ中幕屹,連接器(connector)共分為以下兩類:
- 傳輸連接器(
transport connector
):用于客戶端和服務端之間( client-to-broker)的通信蓝丙。 - 網絡連接器(
network connector
):用戶集群中多個服務端之間(broker-to-broker)的通信。
2.1 傳輸連接器
傳輸連接器提供了很多連接協(xié)議供使用者來選擇望拖,ActiveMQ 的5.15版本包括以下協(xié)議:
- tcp渺尘,默認使用的協(xié)議,符合大多數的使用場景说敏。
- udp鸥跟,客戶端使用udp協(xié)議和服務端通信,當客戶端和服務端之間存在防火墻可以考慮使用udp協(xié)議。
- vm医咨,當客戶端和服務端在同一個JVM中可以考慮使用枫匾。直接使用虛擬機本地方法調用,從而避免網絡通信的開銷拟淮。
- nio干茉,本質上還是tcp,只是使用了java NIO包很泊,某些場景下可能性能更好角虫。
- ssl,基于tcp提供安全的通信委造。
- http/https上遥,允許客戶端使用REST或Ajax的方式進行連接,可以通過JS給ActiveMQ發(fā)送消息争涌。
- multicast粉楚,客戶端使用組播的方式連接到服務端。
- websocket亮垫,可以通過HTML5中的websocket技術連接服務端模软。
- amqp,高級消息隊列協(xié)議饮潦,很多消息中間件都支持該協(xié)議燃异。ActiveMQ5.8版本開始支持。
- mqtt继蜡,MQTT是一個基于客戶端-服務器的消息發(fā)布/訂閱傳輸協(xié)議回俐,主要應用在loT(物聯網)。
- stomp稀并,STOMP是在WebSocket之上提供了一個基于幀的線路格式(frame-based wire format)層仅颇,用來定義消息的語義,就像HTTP在TCP套接字之上添加了請求-響應模型層一樣碘举。ActiveMQ5.6版本開始支持
用戶可以根據自己應用的特點來選擇不同的協(xié)議忘瓦。上面介紹的是客戶端和服務端之間通信的一些基本協(xié)議,除了這些基本協(xié)議之外引颈,ActiveMQ還提供了客戶端和服務器端通信高可用的配置耕皮。
- failover,為客戶端提供重連服務端的邏輯蝙场,允許配置多個上面介紹的不同協(xié)議的連接配置凌停,并隨機的從其中選擇一個進行連接,如果失敗則繼續(xù)選擇其他服務重試售滤。failover的配置格式:
failover:(tcp://ip1:61616,tcp://ip2:61616)?initialReconnectDelay=100
罚拟。 - fanout,采用復制的方式將消息發(fā)送給多個服務端,配置格式為:
fanout:(tcp://localhost:61629,udp://localhost:61639,tcp://localhost:61649)
fanout
2.2 網絡連接器
網絡連接器用來將多個消息服務器連接在一起形成集群舟舒,作為一個整體對外提供服務。
ActiveMQ中的網絡連接器嗜憔,常用的有如下兩種:
- static秃励,靜態(tài)協(xié)議,用于已知多個服務器的IP地址吉捶。
- multicast夺鲜,廣播協(xié)議,用于服務器之間實現動態(tài)識別呐舔。
3. 連接器的配置及使用
服務端的連接器配置可以配置在ActiveMQ的配置文件%ActiveMQ_home%\conf\activemq.xml
中(當然ActiveMQ啟動時币励,可以指定配置文件)。在activemq.xml文件中珊拼,可以看到如下配置:
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
這段配置的含義是食呻,這個ActiveMQ服務對外提供tcp\amqp\stomp\ws\mqtt協(xié)議,以便客戶端連接澎现。
以TCP為例仅胞,可以看到配置語法都是形如:
tcp://hostname:port?key=value
具體各個協(xié)議具體怎么配置、支持哪些參數請參考官方文檔:
URI Protocols
Configuring Transports
指定單獨的配置文件
ActiveMQ服務默認的配置文件為:%ActiveMQ_home%\conf\activemq.xml
剑辫。我們可以根據應用的需求對此默認的配置文件進行修改干旧,有時我們不想改動此文件,而是指定另外一個單獨的文件作為ActiveMQ的配置妹蔽。針對這種情況椎眯,ActiveMQ提供了xbean支持,具體用法如下所示:
activemq start xbean:examples/conf/myactivemq.xml
xbean支持相對路徑和絕對路徑胳岂,下面的演示環(huán)境是windows cmd
1.相對路徑
D:\app\apache-activemq-5.15.8\bin> activemq start xbean:../examples/conf/activemq.xml
2.絕對路徑
D:\app\apache-activemq-5.15.8\bin> activemq start xbean:/D:/app/apache-activemq-5.15.8/examples/conf/activemq-demo.xml
客戶端指定連接協(xié)議
那么客戶端如何指定連接的協(xié)議呢编整?可以在創(chuàng)建ConnectionFactory
對象時,指定使用什么協(xié)議和消息服務端進行通信乳丰。如下所示:
String brokerURL = "tcp://localhost:61616";
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerURL);
和服務端一樣闹击,客戶端也支持在url后面帶一些參數,用來配置屬性成艘。
參考資料/擴展閱讀
[1]:深入理解AMQP協(xié)議
[2]:《ActiveMQ In Action》
[3]:消息隊列之 ActiveMQ
[4]:Networks of Brokers