ActiveMQ(一)-消息中間件概述

一、概述

1. 概念

      什麼是中間件?
    非底層操作系統軟件/業務應用軟件,不直接給最終用戶使用,不能直接爲客戶提供價值的軟件。

      什麼是消息中間件?
    關注於數據的發送和接收,利用高效可靠的異步消息傳遞機制集成分佈式系統。

      什麼是JMS?
    JMS(Java Message Service)是一個Java平臺中面向消息中間件的API,用於在兩個應用程序之間或分佈式系統中發送消息,進行異步通信。

      什麼是AMQP?
    AMQP(Advanced Message Queuing Protocol)是提供統一消息服務的應用層標準協議,基於此協議的客戶端和消息中間件可傳遞消息,不受客戶端/中間件不同產品不同開發語言等條件限制。

2. 優點

    消息中間件爲應用系統提供高效、靈活的消息同步和異步傳輸處理、存儲轉發、可靠傳輸。

    優點:
        系統解耦;異步;橫向擴展;安全可靠;可以實現順序保證。

        但與AMQP相比,跨平臺支持較差。

3. 常見消息中間件服務器

    ActiveMQ
    Apache出品最流行強勁的開源消息總線,完全支持JMS 1.1和J2EE 1.4規範的JMS Provider實現。
    特性:
        多種語言和協議編寫客戶端;完全支持JMS 1.1和J2EE 1.4規範(持久化,XA消息,事務);支持虛擬主題、組合目的、鏡像隊列

    RabbitMQ
    開源的AMQP實現,服務器端用Erlang語言編寫,用於在分佈式系統中存儲轉發消息,具有易用性、擴展性、高可用性。
    特性:
        支持多種客戶端;AMQP完整實現(vhost,Exchange,Binding等);事務特性/發佈確認;消息持久化。

    Kafka
    高吞吐量的分佈式發佈訂閱消息系統,是分佈式、分區、可靠的分佈式日誌存儲服務(對消息順序要求嚴格),通過一種獨特的設計提供了消息系統的功能(並不算嚴格的消息中間件)。
    特性:
        通過O(1)的磁盤數據結構提供消息持久化,即使是對於TB的消息存儲也能保持長時間的穩定性能;高吞吐量,即使是普通硬件也可能達到百萬/秒的消息;分區、消費者分組。

ActiveMQ適合中小企業級消息應用場景,不適用於上千隊列應用場景;RabbitMQ適合穩定性要求高的企業級應用(金融);Kafka適用於大數據日誌處理或對實時性(少量延遲)、可靠性要求稍低的應用場景。

4. JMS規範

    JMS概念:

    提供者:實現JMS規範的消息中間件服務器
    客戶端:發送/接受消息的應用程序
    生產者/發佈者:創建併發送消息的客戶端
    消費者/訂閱者:接受並處理消息的客戶端
    消息模式:在客戶端之間傳遞消息的方式,JMS中定義了主題和隊列兩種方式。

    JMS消息模式:
    (1)、隊列模型:客戶端包括生產者、消費者;隊列中的消息只能被一個消費者消費;消費者可以隨時消費隊列中的消息。
    (2)、主題模式:客戶端包括髮布者、訂閱者;主題中的消息會被所有訂閱者消費;消費者不能消費訂閱前發送到主題中的消息。

    JMS編碼接口:
這裏寫圖片描述

    ConnectionFactory:用於創建連接到消息中間件的連接工廠
    Connection:應用程序與消息服務器之間的通信鏈路
    Destination:消息發佈和接受的地點,包括隊列或主題
    Session:單線程上下文,用於發送和接受消息
    MessageConsumer:由會話創建,用於接收發送到目標的消息
    MessageProducer:由會話創建,發送消息到目標
    Message:在生產者消費者間傳送的對象,一般由消息頭、消息屬性、消息體組成。

二、JMS簡單使用

下載ActiveMQ後,進行解壓,在bin目錄下win32/win64中找到以管理員方式運行InstallService.bat,然後訪問網址localhost:8161可查看ActiveMQ是否安裝成功。

這裏寫圖片描述

1. 隊列模式

創建項目,引入解壓包下的activemq-all-5.15.0.jar到項目中,進行編碼開發:
這裏寫圖片描述

在剛剛那個網站上可以看到使用隊列模式生成的十條消息
這裏寫圖片描述

編寫消費者,和生產者代碼大致相同:
這裏寫圖片描述

開啓了兩個消費者,可以看到在隊列模式下一條消息只供一個消費者消費,兩個消費者獲取消息幾乎是均勻獲取(因爲十條消息太少,所以增加到了二十條,只是修改了生產者for循環中的停止條件)。
這裏寫圖片描述

2. 主題模式

代碼幾乎和隊列模式幾乎完全相同,只需要修改一下部分:

Destination destination=new ActiveMQTopic(topicName);

開啓了兩個消費者,可以看到在主題模式下消費者必須在發佈者之前啓動(訂閱),一條消息供多個消費者使用(貌似懶得連類名都沒有改,哈哈哈哈哈嗝)。
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章