ActiveMQ預設協議和IO模型優化
在ActiveMQ的官方網站上,列出了目前ActiveMQ中支援的所有訊息協議,它們是:AMQP、MQTT、OpenWire、REST、Stomp、XMPP;
不同的協議需要設定不同的網路監聽埠,這個相關設定在ActiveMQ安裝目錄的./conf/conf/activemq.xml主配置檔案中。主配置檔案採用XML格式進行描述,其中的“transportConnectors”標記描述了各種協議的網路監聽埠,配置openwire協議的接入埠號為本機所有IP裝置的61616(0.0.0.0代表本機所有IP裝置) <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"
每一個“transportConnector”標記的name屬性和uri屬性都必須填寫,name屬性的值可以隨便填寫,它將作為一個Connector元素,顯示在ActiveMQ管理介面的Connections欄目中;URI引數部分,每一種協議都有一些特定的引數,讀者可參考ActiveMQ官網中,關於“協議”部分的介紹:http://activemq.apache.org/protocols.html。URI描述資訊的頭部是採用協議名稱:例如,描述amqp協議的監聽埠時,採用的URI描述格式為“amqp://……”;描述Stomp協議的監聽埠時,採用的URI描述格式為“stomp://……”。唯獨在進行openwire協議描述時,URI頭卻採用的“tcp://…..”。這是因為
ActiveMQ在Version 5.13.0+ 版本後,將OpenWire, STOMP, AMQP, MQTT這四種主要協議的埠監聽進行了合併,並使用auto關鍵字進行表示。也就是說,ActiveMQ將監聽這一個埠的訊息狀態,並自動匹配合適的協議格式。配置如下:
- 1
- 2
- 3
以上的URI配置資訊中,可以使用所有通用的Connection Configuration、Wire Formats Configuring、Server side options和TCP Transport Configuration配置項。但是這種優化只是讓ActiveMQ的連線管理變得簡潔了,並沒有提升單個節點的處理效能。
如果您不特別指定ActiveMQ的網路監聽埠,那麼這些埠都將使用BIO網路IO模型。所以為了首先提高單節點的網路吞吐效能,我們需要明確指定Active的網路IO模型,如下所示:
- 1
- 2
- 3
請注意,URI格式頭以”nio”開頭,表示這個埠使用以TCP協議為基礎的NIO網路IO模型。但是這樣的設定方式,只能使這個埠支援Openwire協議。那麼我們怎麼既讓這個埠支援NIO網路IO模型,又讓它支援多個協議呢?ActiveMQ的服務端設定,允許開發人員使用“+”符號來為埠設定多種特性,如下:
- 1
- 2
- 3
- 4
- 5
所以如果我們既需要某一個埠支援NIO網路IO模型,又需要它支援多個協議,那麼可以進行如下的配置:
- 1
另外,如果是為了生產環境進行的配置,那麼您至少應該還要配置這個埠支援的最大連線數量、設定每一條訊息的最大傳輸值、設定NIO使用的執行緒池最大工作執行緒數量。