ActiveMQ的初步瞭解

什麼是ActiveMQ:

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

  2. 而後你得知道什麼是JMS: JMS(Java Message Service)Java消息服務,應用程序接口,是一個Java平臺中關於面向消息中間件(MOM)的API,用於在兩個應用程序之間,或分佈式系統中發送消息,進行異步通訊。java

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

  1. 最後纔是ActiveMQ: Apache下的一個很是流行的消息中間件,使用JAVA支持的JMS Provider實現,因此和JAVA程序徹底兼容,開發java項目中間件首選。固然ActiveMQ不只僅支持JAVA,在C++、Dotnet、Python、Php、Ruby、Websocket等多種客戶端均可以提供良好的服務。

ActiveMQ的使用場景:

其實也就是爲何要使用MQ。 :watermelon:github

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

  2. 解耦 下降工程之間的耦合程度,從設計角度來說,達到低耦合高內聚的目的。當應用須要維護的時候,不一樣應用能夠獨立的擴展或修改,只須要遵循一樣的接口約束便可。session

  3. 冗餘 消息隊列能夠對隊列中的消息進行持久化處理,防止數據丟失。不少消息隊列都採用「插入-獲取-刪除」的模式,只有當處理數據的過程成功而且返回提示,纔會進行消息的刪除,不然消息將一直保存在隊列之中。異步

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

  5. 保證有序 消息隊列能夠對消息進行優先級設定,而後根據優先級來對消息進行排序,達到重要數據優先處理。tcp

  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三種平臺

相關文章
相關標籤/搜索