ActiveMQ的初步瞭解

YZcxy發表於2017-12-05

什麼是ActiveMQ:

  1. 首先你得了解什麼是MOM: MOM(Message Oriented Middleware),分散式系統的整合,指的是利用高效可靠的訊息傳遞機制進行平臺無關的資料交流,並基於資料通訊來進行分散式系統的整合。

  2. 然後你得知道什麼是JMS: JMS(Java Message Service)Java訊息服務,應用程式介面,是一個Java平臺中關於面向訊息中介軟體(MOM)的API,用於在兩個應用程式之間,或分散式系統中傳送訊息,進行非同步通訊。

摘要來自百度百科,這裡就不對前兩個進行贅述,有興趣的自行Google。 :cherries:

  1. 最後才是ActiveMQ: Apache下的一個非常流行的訊息中介軟體,使用JAVA支援的JMS Provider實現,所以和JAVA程式完全相容,開發java專案中介軟體首選。當然ActiveMQ不僅僅支援JAVA,在C++、Dotnet、Python、Php、Ruby、Websocket等多種客戶端都可以提供良好的服務。

ActiveMQ的使用場景:

其實也就是為什麼要使用MQ。 :watermelon:

  1. 非同步通訊 不需要即時處理的業務,將其放去訊息佇列中,在需要處理的時候直接去佇列中取出來,達到了生產者和消費者不用互相瞭解對方,生產者只需要專注於生產,消費者專注於消費。

  2. 解耦 降低工程之間的耦合程度,從設計角度來講,達到低耦合高內聚的目的。當應用需要維護的時候,不同應用可以獨立的擴充套件或修改,只需要遵循同樣的介面約束即可。

  3. 冗餘 訊息佇列可以對佇列中的訊息進行持久化處理,防止資料丟失。很多訊息佇列都採用“插入-獲取-刪除”的模式,只有當處理資料的過程成功並且返回提示,才會進行訊息的刪除,否則訊息將一直儲存在佇列之中。

  4. 過載保護 在請求量突發的高峰期間,為了讓系統保持正常工作,又不想每時每刻都按最大峰值投入資源。使用訊息佇列就可以讓關鍵元件頂住突發壓力,不至於讓整個系統崩潰。

  5. 保證有序 訊息佇列可以對訊息進行優先順序設定,然後根據優先順序來對訊息進行排序,達到重要資料優先處理。

  6. 緩衝 訊息佇列有助於控制和優化資料流經過系統的速度。以調節系統響應時間。

  7. 資料流處理 大資料業務需要對資料流進行分析,在訊息佇列中進行處理是最好不過的。

ActiveMQ原理剖析:

  • 兩種執行模型

    • PTP點對點通訊: 使用queue作為資訊載體,滿足生產者與消費者模式,一個訊息只能被一個消費者使用,沒有被消費的訊息可以持久保持在queue 中等待被消費。
    • Pub/Sub釋出訂閱模式: 使用Topic主題作為通訊載體,類似於廣播模式,在訊息廣播期間,所有的訂閱者都可以接受到廣播訊息,在一條訊息廣播之後才訂閱的使用者是收不到該條訊息的。
  • ActiveMQ的組成模組

    • Broker:訊息伺服器,作為server提供訊息核心服務。
    • Producer:訊息生產者,業務的發起方,負責生產訊息傳輸給broker。
    • Consumer:訊息消費者,業務的處理方,負責從broker獲取訊息並進行業務邏輯處理。
    • Topic:主題,釋出訂閱模式下的訊息統一彙集地,不同生產者向topic傳送訊息,由MQ伺服器分發到不同的訂閱者,實現訊息的廣播。
    • Queue:佇列,PTP模式下,特定生產者向特定queue傳送訊息,消費者訂閱特定的 queue完成指定訊息的接收。
    • Message:訊息體,根據不同通訊協議定義的固定格式進行編碼的資料包,來封裝業務 資料,實現訊息的傳輸。
  • ActiveMQ的常用協議

    • AMQP協議 AMQP即Advanced Message Queuing Protocol,一個提供統一訊息服務的應用層標準高階消 息佇列協議,是應用層協議的一個開放標準,為面向訊息的中介軟體設計。基於此協議的客戶端與訊息中介軟體可傳遞訊息,並不受客戶端/中介軟體不同產品,不同開發語言等條件的限制。

    • MQTT協議 MQTT(Message Queuing Telemetry Transport,訊息佇列遙測傳輸)是IBM開發的一個即時 通訊協議,有可能成為物聯網的重要組成部分。該協議支援所有平臺,幾乎可以把所有聯網 物品和外部連線起來,被用來當做感測器和致動器(比如通過Twitter讓房屋聯網)的通訊協 議。

    • STOMP協議 STOMP(Streaming Text Orientated Message Protocol)是流文字定向訊息協議,是一種為 MOM(Message Oriented Middleware,面向訊息的中介軟體)設計的簡單文字協議。STOMP提 供一個可互操作的連線格式,允許客戶端與任意STOMP訊息代理(Broker)進行互動。

    • OPENWIRE協議 ActiveMQ特有的協議,官方描述如下 OpenWire is our cross language Wire Protocol to allow native access to ActiveMQ from a number of different languages and platforms. The Java OpenWire transport is the default transport in ActiveMQ 4.x or later. For other languages see the following...

對於ActiveMQ的上述協議,每種協議埠都不一樣,可以自行修改。:tangerine:

編輯activemq.xml,在transportConnectors標籤中登出、修改或刪除不使用的協議。

<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:5672?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"/>

複製程式碼

ActiveMQ運用實踐:

csharp作為生產者例項。

//根據URI建立NMS連線工廠
NMSConnectionFactory factory = new NMSConnectionFactory(brokerUri);
//根據使用者名稱密碼建立連線
IConnection connection = factory.CreateConnection(user, password);
//開啟連線
connection.Start();
//建立Session
ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
//根據destination建立主題
IDestination dest = session.GetQueue(destination);
//建立生產者
IMessageProducer producer = session.CreateProducer(dest);
producer.DeliveryMode = MsgDeliveryMode.NonPersistent;
//傳送訊息
String body = "hello,javaJMS!!  I'm C#";
producer.Send(session.CreateTextMessage(body));
//關閉連線
connection.Close();
複製程式碼

建立Session時可以為會話設定訊息確認模式:

  • AUTO_ACKNOWLEDGE 當客戶端成功從receive或onMessage方法返回之後,會話自動確認客戶端的訊息。
  • CLIENT_ACKNOWLEDGE 客戶通過訊息的acknowledge 方法確認訊息。需要注意的是,在這種模式中,確認是在會話層上進行:確認一個被消費的訊息將自動確認所有已被會話消費的訊息。
  • DUPS_ACKNOWLEDGE 該選擇只是會話遲鈍的確認訊息的提交。如果JMS provider 失敗,那麼可能會導致一些重複的訊息。如果是重複的訊息,那麼JMS provider 必須把訊息頭的JMSRedelivered 欄位設定為true。
  • SESSION_TRANSACTED 即訊息傳送者傳送訊息後,需要提交事務,否則訊息不進入broker待傳送佇列中。

相關實踐在這裡不進行詳細描述,詳情可以參考我的Demo專案。:lemon: 以ActiveMQ為訊息中介軟體,關聯dotnet,java,ws三種平臺

相關文章