rocketmq簡介

Apache RocketMQ™是一個開源的分佈式消息和流數據平臺。php

一、既然是消息系統,最核心的功能就是要提供消息的發佈與訂閱功能,最簡單的概念模型以下:java

可是rocketmq提供的能力會比這個複雜的多,如一個生產方發佈消息,須要多個消費方訂閱,也會存在多個生產方生產消息,一個消費方消費消息,出現一對多,多對一的狀況。c++

上圖就是擴展了producer、consumer和Topic的概念模型,rocketmq最核心的概念就是Tpoic,producer和consumer都是圍繞Topic展開,每一個broker下能夠有多個topic,topic下又能夠有很對隊列messageQueue,相同的topic又能夠分佈在不一樣broker節點下,producer發送消息會輪訓的發送到topic的隊列下;相同consumer分組是負載均衡訂閱消息,不一樣的consumer分組之間互不干擾,即便廣播訂閱消息;同一Topic下的每一個隊列只能被相同分組下的一個consumer訂閱消費,但一個consumer能夠消費多個隊列。web

二、總體部署架構圖編程

  • nameserver是幾乎沒有狀態的節點,能夠集羣部署,節點之間也沒有任何數據同步。
  • broker的部署相對複雜,是一個數據分散集羣,分master和slave,每一個master存儲一部分數據,爲了數據的高可用,每一個master節點能夠有多個slave節點,master之間無數據同步,master與slave之間有數據同步。master和slave之間的關係經過brokerName來綁定,brokerId來定義,即相同的brokerName,brokerId等於0表示master節點,非0表示slave節點。全部的broker節點與nameserver集羣的全部節點保持長鏈接,定時註冊Topic信息到全部的nameserver。
  • producer與nameserver集羣中的一臺(隨機)保持長鏈接,定時獲取Topic路由信息,而且與提供Topic服務的broker的master節點保持長鏈接,並定時發送心跳,producer集羣也是無狀態的,能夠集羣部署。
  • consumer與nameserver集羣中的一臺(隨機)保持長鏈接,定時獲取Topic路由信息,而且向提供Topic的broker的master和slave節點都保持長鏈接,並定時發送心跳,Consumer既能夠從 Master 訂閱消息,也能夠從 Slave 訂閱消息,訂閱規則由 Broker 配置決定,consumer也是集羣的部署的,負載均衡的消費Topic的消息。

三、消息的存儲模型架構

rocketmq的消息存儲與消費隊列是分開的,消息被存儲在commitLog下,而後再異步構建消費隊列messageQueue,消費隊列並不存儲真正的消息內容,只是存儲消息在commitLog下的偏移量、消息的長度和消息的tag的hashcode。如圖所示:負載均衡

  • 全部數據單獨存儲到一個 Commit Log,徹底順序寫,隨機讀。
  • 對最終用戶展示的隊列實際只存儲消息在 Commit Log 的位置信息,而且串行方式刷盤。

這樣設計有如下優點:異步

  • 隊列輕量化,單個隊列數據量很是少。
  • 對磁盤的訪問串行化,避免磁盤竟爭,不會由於隊列增長致使 IOWAIT 增高。

但也存在如下缺點:分佈式

  • 寫雖然徹底是順序寫,可是讀卻變成了徹底的隨機讀。
  • 讀一條消息,會先讀 Consume Queue,再讀 Commit Log,增長了開銷。
  • 要保證 Commit Log 與 Consume Queue 徹底的一致,增長了編程的複雜度。

四、rocketmq具備如下特色工具

  • 可以保證嚴格的消息順序
  • 提供豐富的消息拉取模式
  • 高效的訂閱者水平擴展能力
  • 實時的消息訂閱機制
  • 億級消息堆積能力

與其餘消息隊列系統的一個對好比下:

消息產品 支持客戶端 協議和規範 順序消息 定時消息 批量消息 廣播消息 消息過濾 消息回溯 消息優先級 高可用和故障切換 消息追蹤 配置 管理和操做工具 Server Triggered Redelivery 消息存儲
ActiveMQ java,c++,php,net 推模型,支持 OpenWire, STOMP, AMQP, MQTT, JMS 獨佔消費和消息分組支持順序 支持 不支持 支持 支持 支持 支持 支持,leveldb+zookeeper 不支持 默認配置是低級別的,用戶須要優化配置參數 支持 不支持 支持JDBC,leveldb,kahadb
Kafka java,scala 拉模型, 支持TCP 分區內消息有順序 不支持 支持異步生產者 不支持 支持 支持 不支持 支持,依賴zookeeper 不支持 Kafka使用鍵值對格式進行配置。這些值能夠經過文件提供,也能夠經過編程方式提供 支持,使用命令行 不支持 高性能文件存儲
RocketMQ java,c++,go 拉模型, 支持TCP, JMS, OpenMessaging 確保消息的嚴格順序,並能夠優雅地擴展 支持 支持同步模式,以免消息丟失 支持 支持 支持按時間和偏移量 不支持 支持主從模式 支持 開箱即用,用戶只需注意一些配置 支持,命令行和web客戶端 支持 高性能和低延遲的文件存儲
相關文章
相關標籤/搜索