RocketMQ、Kafka、RabbitMQ不完全對比
產品組件(組成)
產品 | 組件 | 組件 | 組件 | 組件 | 組件 | 組件 | 組件 |
---|---|---|---|---|---|---|---|
Rocket MQ | p(producer) | c(consumer) | brocker(支持pull和push,支持順序行消費) | NameServer(服務發現和服務路由,記錄路由信息) | CommitLog(消息持久化存儲) | Consumer Queue(存儲的是在CommitLog中的偏移量延遲隊列) | |
Kafak | p(producer) | c(consumer) | brocker(存儲message) | zk(管理p/c/broker的註冊) | topic(邏輯概念) | ||
Rabbit MQ | p(producer) | c(consumer) | exchanger(P與ex直連,通過p的ROUTING_KEY進行消息路由,將消息發送給queue,可以持久化) | Queue(與消費者直連,可持久化) | Binding(exchange與queue的綁定規則) | Routing Key(exchange據此路由消息) | vhost |
產品特性
產品 | 隊列優先級 | 隊列重試 | 消費方式 | 廣播模式 | 持久化 | 跨語言 | 順序 | 事務 | 性能 | 定時 |
---|---|---|---|---|---|---|---|---|---|---|
Rocket MQ | 支持 | 支持 | pull+push | 支持 | 支持 | Java, C++, Go,對java最友好 | 支持 | 支持 | 搞 | 支持 |
Kafka | 不支持 | 不支持 | pull | 支持 | 支持 | java編寫,支持多語言 | 單個分區消息有序 | 支持 | 最高 | 不支持 |
Rabbit MQ | 支持 | 支持 | pull+push | 支持 | 支持 | Erlang編寫,支持多語言 | 可以認爲不支持 | 支持 | 高 | 支持 |
關於性能
諮詢了下朋友kafaka性能搞的原因主要是Kafka的在producer端將多個小消息合併,發送到broker中,還有個重要的原因是做到零拷貝,無需CPU拷貝。還有一些其他原因如kafaka利用partition實現並行處理,最大併發度等於partition的數量。
RocketMQ沒有做消息合併主要考慮到java gc的問題,還有就是消息合併發送萬一出現down機,丟失消息也比不合並出現的問題大。