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
二、總體部署架構圖編程
三、消息的存儲模型架構
rocketmq的消息存儲與消費隊列是分開的,消息被存儲在commitLog下,而後再異步構建消費隊列messageQueue,消費隊列並不存儲真正的消息內容,只是存儲消息在commitLog下的偏移量、消息的長度和消息的tag的hashcode。如圖所示:負載均衡
這樣設計有如下優點:異步
但也存在如下缺點:分佈式
四、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客戶端 | 支持 | 高性能和低延遲的文件存儲 |