1. 程式人生 > >ActiveMQ預設協議和IO模型優化

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&amp;wireFormat.maxFrameSize=104857600"

/>

 每一個“transportConnector”標記的name屬性和uri屬性都必須填寫,name屬性的值可以隨便填寫,它將作為一個Connector元素,顯示在ActiveMQ管理介面的Connections欄目中;URI引數部分,每一種協議都有一些特定的引數,讀者可參考ActiveMQ官網中,關於“協議”部分的介紹:http://activemq.apache.org/protocols.htmlURI描述資訊的頭部是採用協議名稱:例如,描述amqp協議的監聽埠時,採用的URI描述格式為“amqp://……”;描述Stomp協議的監聽埠時,採用的URI描述格式為“stomp://……”。唯獨在進行openwire協議描述時,URI頭卻採用的“tcp://…..”。這是因為

ActiveMQ中預設的訊息協議就是openwire

 ActiveMQ在Version 5.13.0+ 版本後,將OpenWire, STOMP, AMQP, MQTT這四種主要協議的埠監聽進行了合併,並使用auto關鍵字進行表示。也就是說,ActiveMQ將監聽這一個埠的訊息狀態,並自動匹配合適的協議格式。配置如下:

<transportConnectors>
    <transportConnector name="auto" uri="auto://0.0.0.0:61617?maximumConnections=1000" />
</transportConnectors
>
  • 1
  • 2
  • 3

以上的URI配置資訊中,可以使用所有通用的Connection Configuration、Wire Formats Configuring、Server side options和TCP Transport Configuration配置項。但是這種優化只是讓ActiveMQ的連線管理變得簡潔了,並沒有提升單個節點的處理效能。

如果您不特別指定ActiveMQ的網路監聽埠,那麼這些埠都將使用BIO網路IO模型。所以為了首先提高單節點的網路吞吐效能,我們需要明確指定Active的網路IO模型,如下所示:

<transportConnectors>  
    <transportConnector name="nio" uri="nio://0.0.0.0:61618?maximumConnections=1000"/>  
</transportConnectors> 
 
  • 1
  • 2
  • 3

請注意,URI格式頭以”nio”開頭,表示這個埠使用以TCP協議為基礎的NIO網路IO模型。但是這樣的設定方式,只能使這個埠支援Openwire協議。那麼我們怎麼既讓這個埠支援NIO網路IO模型,又讓它支援多個協議呢?ActiveMQ的服務端設定,允許開發人員使用“+”符號來為埠設定多種特性,如下:

<transportConnector name="stomp+nio" uri="stomp+nio://0.0.0.0:61613?transport.transformer=jms"/>
// 表示這個埠使用NIO模型支援Stomp協議

<transportConnector name="amqp+ssl" uri="amqp+ssl://localhost:5671"/>
// 表示這個埠支援amqp和ssl密文傳輸
 
  • 1
  • 2
  • 3
  • 4
  • 5

所以如果我們既需要某一個埠支援NIO網路IO模型,又需要它支援多個協議,那麼可以進行如下的配置:

<transportConnector name="auto+nio" uri="auto+nio://0.0.0.0:61608?maximumConnections=1000" />
 
  • 1

另外,如果是為了生產環境進行的配置,那麼您至少應該還要配置這個埠支援的最大連線數量、設定每一條訊息的最大傳輸值、設定NIO使用的執行緒池最大工作執行緒數量。

 架構設計:系統間通訊(22)——提高ActiveMQ工作效能(上)