1. 程式人生 > >分散式訊息佇列RocketMQ與Kafka的18項差異之“撥亂反正”

分散式訊息佇列RocketMQ與Kafka的18項差異之“撥亂反正”

我們知道,阿里的RocketMQ其實源自Kafka。同時網路上一直流傳著1篇阿里中介軟體團隊所寫的RocketMQ與Kafka的18項差異的文章,並且被廣泛轉發。比如:
http://blog.csdn.net/damacheng/article/details/42846549

作為對Kafka有一點研究的愛好者,認為這18項差異有“斷章取義”之嫌。本著嚴禁的科學精神,本文試圖對這18個條款進行逐一剖析。有不正確之處,歡迎批評指正。

有興趣朋友可以關注公眾號“架構之道與術”, 獲取最新文章。
或掃描如下二維碼:
這裡寫圖片描述

差異之1–”資料可靠性”問題

(1)Kafka只支援非同步replication?

結論:Kafka不僅支援非同步replication,也支援同步replication,也就是:等訊息同步到所有副本之後,再返回給客戶端成功。

具體細節,可以參考我之前寫的Kakfa原始碼分析序列,配置ack引數即可實現同步複製。

(2)Kafka只支援非同步刷盤?

結論:預設Kafka是非同步刷盤,每3s鍾,呼叫1次fsync。但Kafka支援同步刷盤,也就是說,你可以每寫入1條訊息,就刷盤1次。

具體細節,參考我寫的Kafka原始碼分析序列,Log檔案結構和刷盤原理那1節。同樣,也是配置一個log的引數即可。

(3)Kafka的可靠性解決辦法–叢集思路

那為什麼Kafka預設使用了非同步刷盤呢,不怕丟資料嗎?其實不是。

Kafka其實是用叢集的思路,每個topic_partition多個備份(你可以保證這多個備份是完全一致的)。一臺機器掛了,因為資料在page cache裡面,會丟;但多個備份同時掛的可能性,就很小了。

所以關於“可靠性”的對比,不能光是“單機”的思路。

差異之2– “效能問題“

原文之中比較kafka和RocketMQ的效能的時候,個人認為不是在一個維度上比較。

要比較效能,不能1個是“同步複製”,一個是“非同步複製”來比較,這樣沒有可比性。

要比較,大家都“同步複製”“同步刷盤”;或者大家都“非同步複製”,“非同步刷盤”來比。

因為“效能”和“可靠性”本來就是一對權衡的因素,不能犧牲一個,來比另一個。

差異之3 – “訊息投遞實時性”

Kafka從0.8以後,就開始支援long pull。所以在實時性上,2者並無差別。

差異之4 – “消費失敗重試”

這個也就是exactly once問題,關於這個,我在Kafka原始碼分析的序列1中,就有探討。

關於這個問題,Kafka的確不處理,而是讓消費的業務方去處理,並給出了相應的解決方案。

差異之5 – “嚴格的訊息順序”

原文中說:“卡夫卡支援訊息順序,但是一臺代理宕機後,就會產生訊息亂序”。

個人認為這個是斷章取義,如果你是非同步複製,可能亂序。

但對於同1個partition,只要你是同步複製,該partition在多個副本上,是完全一致的。一個宕機,切換到另一個,不會產生訊息亂序。

其他

其他諸如“事務訊息”,“定時訊息“,“訊息查詢”,“訊息軌跡”,”按時間的訊息回朔“,這些Kafka的確沒有。

個人認為這些功能可能是RocketMQ針對“電商”的特定業務場景所產生的,而Kafka沒有這麼強的業務針對性,所以沒有考慮這些特定功能。

但沒有這些特定功能,不代表業務方不能自己解決這些問題。只是說,針對這些特定場景,RocketMQ做了些高階功能,從而業務方可以少做一些事情。

關於這些特定功能,以及沒有這些特定功能的話,業務方如何自己解決。後續會在“RocketMQ”原始碼序列中,一一詳細闡述。

相關推薦

分散式訊息佇列RocketMQKafka的18差異撥亂反正

我們知道,阿里的RocketMQ其實源自Kafka。同時網路上一直流傳著1篇阿里中介軟體團隊所寫的RocketMQ與Kafka的18項差異的文章,並且被廣泛轉發。比如: http://blog.csdn.net/damacheng/article/detail

分散式訊息佇列RocketMQ原始碼分析2 -- BrokerNameServer心跳機制

我們知道,Kafka是通過ZK的臨時節點來監測Broker的死亡的。當一個Broker掛了之後,ZK上面對應的臨時節點被刪除,同時其他Broker收到通知。 那麼在RocketMQ中,對應的NameServer是如何判斷一個Broker的死亡呢? 有興趣朋友

分散式訊息佇列 RocketMQ 原始碼分析 —— Message 順序傳送消費

本文主要基於 RocketMQ 4.0.x 正式版 1. 概述 建議前置閱讀內容: 當然對 Message 傳送與消費已經有一定了解的同學,可以選擇跳過。 RocketMQ 提供了兩種順序級別: 普通順序訊息 :Producer 將相關聯的訊息傳送到相同

分散式訊息佇列RocketMQ--事務訊息--解決分散式事務

說到分散式事務,就會談到那個經典的”賬號轉賬”問題:2個賬號,分佈處於2個不同的DB,或者說2個不同的子系統裡面,A要扣錢,B要加錢,如何保證原子性? 一般的思路都是通過訊息中介軟體來實現“最終一致性”:A系統扣錢,然後發條訊息給中介軟體,B系統接收此訊息,進行加錢。 但這裡面有個問題:A是先update D

分散式訊息佇列RocketMQ&Kafka -- 訊息的“順序消費”-- 一個看似簡單的複雜問題

在說到訊息中介軟體的時候,我們通常都會談到一個特性:訊息的順序消費問題。這個問題看起來很簡單:Producer傳送訊息1, 2, 3。。。 Consumer按1, 2, 3。。。順序消費。 但實際情況卻是:無論RocketMQ,還是Kafka,預設都不保證訊息

分散式訊息佇列RocketMQ--事務訊息--解決分散式事務的最佳實踐

說到分散式事務,就會談到那個經典的”賬號轉賬”問題:2個賬號,分佈處於2個不同的DB,或者說2個不同的子系統裡面,A要扣錢,B要加錢,如何保證原子性? 一般的思路都是通過訊息中介軟體來實現“最終一致性”:A系統扣錢,然後發條訊息給中介軟體,B系統接收此訊息,進行加錢。

分散式訊息佇列RocketMQ原始碼分析3 -- Consumer負載均衡機制 -- Rebalance

同Kafka一樣,RocketMQ也需要探討一個問題:如何把一個topic的多個queue分攤給不同的consumer,也就是負載均衡問題。 有興趣朋友可以關注公眾號“架構之道與術”, 獲取最新文章。 或掃描如下二維碼: 在討論這個問題之前,我們先看一

分散式訊息佇列 RocketMQ原始碼解析:事務訊息

摘要: 原創出處 http://www.iocoder.cn/RocketMQ/message-

docker:zookeeperkafka實現分散式訊息佇列

一、安裝 下載映象 docker pull wurstmeister/zookeeper docker pull wurstmeister/kafka 通過docker-compose啟動 docker-compose.yml指令碼(zk+kafka版) vers

Apache RocketMQ 訊息佇列部署視覺化介面安裝

一、介紹 Apache RocketMQ是一個分散式、佇列模型的訊息中介軟體,具有低延遲、高效能和高可靠、萬億級容量和靈活的可擴充套件性。核心元件由四部分組成:Name Servers,Brokers,Producer 和 Consumer;它們中的每一個都可以水平擴充套件,而沒有單一的故障節點。

大型網站架構系列:分散式訊息佇列(一)(轉)

以下是訊息佇列以下的大綱,本文主要介紹訊息佇列概述,訊息佇列應用場景和訊息中介軟體示例(電商,日誌系統)。 本次分享大綱 訊息佇列概述 訊息佇列應用場景 訊息中介軟體示例 JMS訊息服務(見第二篇:大型網站架構系列:分散式訊息佇列(二)) 常用訊息佇列(見第二篇:大型網站架構系列:分

關於阿里訊息佇列RocketMQ(安裝、使用和坑),你需要知道的事情

為什麼選擇RocketMQ Apache RocketMQ作為阿里開源的一款高效能、高吞吐量的分散式訊息中介軟體。因為阿里有海量的資料量,無數業務場景的應用,是RocketMQ搶盡風頭風頭,成為不可多得中介軟體專案,加上已經正式加入Apach俱樂部,作為頂級的開源專案! 一、關於

訊息佇列訊息佇列概述AMQP協議

轉載請註明出處:https://blog.csdn.net/jinixin/article/details/83552185     前面幾篇文章中談了rpc服務, rpc可用於程序間通訊, 使應用得以解耦, 而程序間通訊還可使用訊息佇列來完成. 本篇文章就簡

Kafka分散式訊息佇列

基本架構 Kafka分散式訊息佇列的作用: 解耦:將訊息生產階段和處理階段拆分開,兩個階段互相獨立各自實現自己的處理邏輯,通過Kafka提供的訊息寫入和消費介面實現對訊息的連線處理。降低開發複雜度,提高系統穩定性。 高吞吐率:kafka通過順序讀寫磁碟提供可以和記憶體隨機讀寫相匹敵的讀寫速度,靈活的客戶

基於Docker搭建分散式訊息佇列Kafka

本文基於Docker搭建一套單節點的Kafka訊息佇列,Kafka依賴Zookeeper為其管理叢集資訊,雖然本例不涉及叢集,但是該有的元件都還是會有,典型的kafka分散式架構如下圖所示。本例搭建的示例包含Zookeeper + Kafka + Kafka-manger mark &

RabbitMQ系列分散式訊息佇列應用場景非同步處理、應用解耦、流量削鋒和訊息通訊理解分析

摘要:訊息佇列中介軟體是分散式系統中重要的元件,主要解決應用耦合,非同步訊息,流量削鋒等問題。實現高效能,高可用,可伸縮和最終一致性架構。是大型分散式系統不可缺少的中介軟體。 目前在生產環境,使用較多的訊息佇列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,

Spark Streaming實時流處理筆記(4)—— 分散式訊息佇列Kafka

1 Kafka概述 和訊息系統類似 1.1 訊息中介軟體 生產者和消費者 1.2 Kafka 架構和概念 producer:生產者(生產饅頭) consumer:消費者(吃饅頭) broker:籃子 topic : 主題,給饅頭帶一個標籤,(

(十三)RabbitMQ訊息佇列-VirtualHost許可權管理

VirtualHost 像mysql有資料庫的概念並且可以指定使用者對庫和表等操作的許可權。那RabbitMQ呢?RabbitMQ也有類似的許可權管理。在RabbitMQ中可以虛擬訊息伺服器VirtualHost,每個VirtualHost相當月一個相對獨立的RabbitMQ伺服器,每個

Netty實戰開發(7):Netty結合kafka實現分散式訊息佇列

在分散式遊戲伺服器系統中,訊息處理佇列主要解決問題就是解耦系統中的業務,使得每個系統看起來功能比較單一,而且解決一些全服資料共享等問題。 通常我們知道kafka是作為訊息佇列比較火的一種方式,其實還有(Active MQ,Rabbit MQ,Zero MQ)個人

kafka(01)——分散式訊息佇列kafka概述

kafka是什麼? Apache Kafka是一個開源訊息系統,由Scala寫成。是由Apache軟體基金會開發的一個開源訊息系統專案。 Kafka最初是由LinkedIn開發,並於2011年初開源。 該專案的目標是為處理實時資料提供一個統一、高通量、低等待的