淘寶內部的交易系統使用了淘寶自主研發的Notify消息中間件,使用Mysql做爲消息存儲媒介,可徹底水平擴容,爲了進一步下降成本,咱們認爲存儲部分能夠進一步優化,2011年初,Linkin開源了Kafka這個優秀的消息中間件,淘寶中間件團隊在對Kafka作過充分Review以後,Kafka無限消息堆積,高效的持久化速度吸引了咱們,可是同時發現這個消息系統主要定位於日誌傳輸,對於使用在淘寶交易、訂單、充值等場景下還有諸多特性不知足,爲此咱們從新用Java語言編寫了RocketMQ,定位於非日誌的可靠消息傳輸(日誌場景也OK),目前RocketMQ在阿里集團被普遍應用在訂單,交易,充值,流計算,消息推送,日誌流式處理,binglog分發等場景。sql
總結:RocketMQ的同步刷盤在單機可靠性上比Kafka更高,不會由於操做系統Crash,致使數據丟失。Kafka同步Replication理論上性能低於RocketMQ的同步Replication,緣由是Kafka的數據以分區爲單位組織,意味着一個Kafka實例上會有幾百個數據分區,RocketMQ一個實例上只有一個數據分區,RocketMQ能夠充分利用IO組Commit機制,批量傳輸數據,配置同步Replication與異步Replication相比,性能損耗約20%~30%,Kafka沒有親自測試過,可是我的認爲理論上會低於RocketMQ。apache
總結:Kafka的TPS跑到單機百萬,主要是因爲Producer端將多個小消息合併,批量發向Broker。
RocketMQ爲何沒有這麼作?緩存
RocketMQ使用長輪詢,同Push方式實時性一致,消息的投遞延時一般在幾個毫秒。
消費失敗重試服務器
卡夫卡消費失敗不支持重試。多線程
總結:例如充值類應用,當前時刻調用運營商網關,充值失敗,多是對方壓異步
力過多,稍後再調用就會成功,如支付寶到銀行扣款也是相似需求。分佈式
這裏的重試須要可靠的重試,即失敗重試的消息不由於Consumer宕機致使丟失。性能
MySQL的二進制日誌分發須要嚴格的消息順序測試
RocketMQ支持兩類定時消息優化
卡夫卡不支持分佈式事務消息
阿里雲MQ支持分佈式事務消息,將來開源版本的RocketMQ也有計劃支持分佈式事務消息
消息查詢
卡夫卡不支持消息查詢
RocketMQ支持根據消息標識查詢消息,也支持根據消息內容查詢消息(發送消息時指定一個消息密鑰,任意字符串,例如指定爲訂單編號)
總結:消息查詢對於定位消息丟失問題很是有幫助,例如某個訂單處理失敗,是消息沒收到仍是收處處理出錯了。
消息回溯
卡夫卡理論上能夠按照偏移來回溯消息
總結:典型業務場景如consumer作訂單分析,可是因爲程序邏輯或者依賴的系統發生故障等緣由,致使今天消費的消息所有無效,須要從新從昨天零點開始消費,那麼以時間爲起點的消息重放功能對於業務很是有幫助。
消費並行度
RocketMQ消費並行度分兩種狀況
卡夫卡不支持消息軌跡
阿里雲MQ支持消息軌跡
開發語言友好性
卡夫卡採用斯卡拉編寫
RocketMQ採用的Java語言編寫
券商端消息過濾
卡夫卡不支持代理端的消息過濾
RocketMQ支持兩種代理端消息過濾方式
理論上Kafka要比RocketMQ的堆積能力更強,不過RocketMQ單機也能夠支持億級的消息堆積能力,咱們認爲這個堆積能力已經徹底能夠知足業務需求。