1. 程式人生 > >ActiveMQ學習筆記(7)----ActiveMQ支援的傳輸協議

ActiveMQ學習筆記(7)----ActiveMQ支援的傳輸協議

1. 連線到ActiveMQ

  Connector: Active提供的,用來實現連線通訊的功能,包括:client-to-broker,broker-to-broker.ActiveMQ允許客戶端使用多種協議來連線。

  1.1 配置Transport Connecto

  在conf/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&amp;wireFormat.maxFrameSize=104857600"/> <transportConnector name="amqp" uri="amqp://0.0.0.0:9999?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/> <transportConnector
name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/> <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/> <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"
/> </transportConnectors>

   1.2ActiveMQ 支援client-broker通訊協議如下:

  1. TCP:這個也是預設使用的協議。

  2. NIO

  3. UDP

  4. SSL

  5. HTTP(S)

  6.VM:如果客戶端和broker在一個虛擬機器內的話,可以通過VM協議在VM內通訊,從而減少網路傳輸的開銷。

2. ActiveMQ支援的傳輸協議和配置

  2.1 Transmission Control Protocol (TCP)

    1. 這是預設的broker配置,TCP的client監聽埠預設是61616

    2. 在網路傳輸資料前,必須要序列化資料,訊息是通過一個叫wire protocol的來序列化成位元組流。預設情況下,ActiveMQ把wire protocol叫做OpenWire,它的目的是促使網路上的效率和資料快速互動。

    3. TCP連線的URI形式:tcp://hostname:port?key=value&key=value, 加粗部分是必須的。

    4. TCP傳輸的優點:

      (1) TCP協議傳輸可靠性高,穩定性強。

      (2) 高效性:位元組流方式傳遞,效率很高

      (3) 有效性:可用性:應用廣泛,支援任何平臺

    5. 所有關於Transport協議的可配置引數,可以參考

      http://activemq.apache.org/configuration-version-5-transports.html

  2.2 New I/O API Protocol(NIO)

    1: NIO協議和TCP協議類似,但是NIO更側重於底層的訪問操作。它允許開發人員對同一資源可有更多的client呼叫和伺服器端有更多的負載。

    2. 適合使用NIO協議的場景

      (1) 可能有大量的Client去連線到Broker上,

        一般情況下,大量的Client去連線到Broker是被作業系統的執行緒數所限制的。因此,NIO的實現比TCP需要更少的執行緒去執行,所以建議使用NIO協議。

      (2) 可能對於Broker有一個很遲鈍的網路傳輸

        NIO比TCP提供了更好的效能。

    3. Transport Connector配置示例:

 <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="nio" uri="nio://0.0.0.0:61617?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

  上面的的配置,示範了一個TCP協議監聽61616埠,一個NIO協議監聽61617埠。

  2.3 User Datagram Protocol (UDP)

    1. UDP和TCP的區別

      (1) TCP是一個原始流的傳遞協議,意味著資料包是有保證的,換句話說,資料包是不會被複制和丟失的。UDP,另一方面,它是不會保證資料包的傳遞的。也就是可能會丟包的。

      (2 TCP也是一個穩定可靠資料包傳遞協議,意味著資料在傳遞的過程中不會被丟失。這樣確保了在傳送和接收之間能夠可靠的傳遞。相反,UPD僅僅是一個連線協議,所以沒有可靠性之說。

    2. 從上面可以得出:TCP是被用在穩定可靠的場景中,UDP通常在快速資料傳遞和不怕資料丟失的場景中使用,當ActiveMQ通過防火牆時,只能用UDP

    3. UDP連線的URI形式:udp://hostname:port?key=value

    4. Transport Connector配置示例:

 <transportConnector name="udp" uri="udp://0.0.0.0:61618?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

  2.4 Secure Sockets Layer Protocol (SSL)

    1. 連線URL形式:ssl://hostname:port?key=value

    2. Transport Connector配置示例

 <transportConnector name="ssl" uri="ssl://0.0.0.0:61618?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

  2.5 Hypertext Transfer Protocol(HTTP/HTTPS)

    1. 像web和email等服務需要通過防火牆來訪問的,Http可以適用於這種場合

    2. 連線的URI形式:http://hostname:port?key=value或https://hostname:port?key=value

    3. Transport Connector 配置示例

 <transportConnector name="http" uri="http://0.0.0.0:61618?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

  2.6 VM Protocol (VM)

    1. VM transport允許在vm內部通訊,從而避免了網路傳輸的開銷。這時候採用的連線不是socket連線,而是直接的方法呼叫。

    2. 第一個建立VM連線的客戶會啟動一個embed VM broker,接下來所有使用相同的broker name 的vm連線都會使用這個broker.當這個broker上所有的;連線都關閉的時候,這個broker也會自動關閉。

    3. 連線的URI形式:vm://brokerName?key?value

    4. 在Java中嵌入的方式:

      vm:broker:(tcp://localhost:6000)?brokerName=embededbroker&persistent=false,定義一個嵌入的broker名稱為embededbroker以及配置一個tcptransportconnector監聽在埠6000上。

    5. 使用載入一個配置檔案來啟動broker

      vm://localhost?brokerConfig=xbean:activemq.xml

實際開發中,大部分使用的都是在tcp和nio之間取捨。