精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

RabbitMQ七戰(zhàn)Kafka,差異立現(xiàn)!

開發(fā) 后端 Kafka
這篇文章會先介紹RabbitMQ和Apache Kafka內(nèi)部實(shí)現(xiàn)的相關(guān)概念。緊接著會主要介紹這兩種技術(shù)的主要不同點(diǎn)以及他們各自的優(yōu)缺點(diǎn),最后我們會說明一下怎樣選擇這兩種技術(shù)。

作為一個有豐富經(jīng)驗(yàn)的微服務(wù)系統(tǒng)架構(gòu)師,經(jīng)常有人問我,“應(yīng)該選擇RabbitMQ還是Kafka?”。基于某些原因, 許多開發(fā)者會把這兩種技術(shù)當(dāng)做等價的來看待。的確,在一些案例場景下選擇RabbitMQ還是Kafka沒什么差別,但是這兩種技術(shù)在底層實(shí)現(xiàn)方面是有許多差異的。

不同的場景需要不同的解決方案,選錯一個方案能夠嚴(yán)重的影響你對軟件的設(shè)計(jì),開發(fā)和維護(hù)的能力。

這篇文章會先介紹RabbitMQ和Apache Kafka內(nèi)部實(shí)現(xiàn)的相關(guān)概念。緊接著會主要介紹這兩種技術(shù)的主要不同點(diǎn)以及他們各自的優(yōu)缺點(diǎn),最后我們會說明一下怎樣選擇這兩種技術(shù)。

一、異步消息模式

異步消息可以作為解耦消息的生產(chǎn)和處理的一種解決方案。提到消息系統(tǒng),我們通常會想到兩種主要的消息模式——消息隊(duì)列和發(fā)布/訂閱模式。

1、消息隊(duì)列

利用消息隊(duì)列可以解耦生產(chǎn)者和消費(fèi)者。多個生產(chǎn)者可以向同一個消息隊(duì)列發(fā)送消息;但是,一個消息在被一個消息者處理的時候,這個消息在隊(duì)列上會被鎖住或者被移除并且其他消費(fèi)者無法處理該消息。也就是說一個具體的消息只能由一個消費(fèi)者消費(fèi)。

消息隊(duì)列

需要額外注意的是,如果消費(fèi)者處理一個消息失敗了,消息系統(tǒng)一般會把這個消息放回隊(duì)列,這樣其他消費(fèi)者可以繼續(xù)處理。消息隊(duì)列除了提供解耦功能之外,它還能夠?qū)ιa(chǎn)者和消費(fèi)者進(jìn)行獨(dú)立的伸縮(scale),以及提供對錯誤處理的容錯能力。

2、發(fā)布/訂閱

發(fā)布/訂閱(pub/sub)模式中,單個消息可以被多個訂閱者并發(fā)的獲取和處理。

發(fā)布/訂閱

例如,一個系統(tǒng)中產(chǎn)生的事件可以通過這種模式讓發(fā)布者通知所有訂閱者。在許多隊(duì)列系統(tǒng)中常常用主題(topics)這個術(shù)語指代發(fā)布/訂閱模式。在RabbitMQ中,主題就是發(fā)布/訂閱模式的一種具體實(shí)現(xiàn)(更準(zhǔn)確點(diǎn)說是交換器(exchange)的一種),但是在這篇文章中,我會把主題和發(fā)布/訂閱當(dāng)做等價來看待。

一般來說,訂閱有兩種類型:

1)臨時(ephemeral)訂閱,這種訂閱只有在消費(fèi)者啟動并且運(yùn)行的時候才存在。一旦消費(fèi)者退出,相應(yīng)的訂閱以及尚未處理的消息就會丟失。

2)持久(durable)訂閱,這種訂閱會一直存在,除非主動去刪除。消費(fèi)者退出后,消息系統(tǒng)會繼續(xù)維護(hù)該訂閱,并且后續(xù)消息可以被繼續(xù)處理。

二、RabbitMQ

RabbitMQ作為消息中間件的一種實(shí)現(xiàn),常常被當(dāng)作一種服務(wù)總線來使用。RabbitMQ原生就支持上面提到的兩種消息模式。其他一些流行的消息中間件的實(shí)現(xiàn)有ActiveMQ,ZeroMQ,Azure Service Bus以及Amazon Simple Queue Service(SQS)。這些消息中間件的實(shí)現(xiàn)有許多共通的地方,這邊文章中提到的許多概念大部分都適用于這些中間件。

1、隊(duì)列

RabbitMQ支持典型的開箱即用的消息隊(duì)列。開發(fā)者可以定義一個命名隊(duì)列,然后發(fā)布者可以向這個命名隊(duì)列中發(fā)送消息。最后消費(fèi)者可以通過這個命名隊(duì)列獲取待處理的消息。

2、消息交換器

RabbitMQ使用消息交換器來實(shí)現(xiàn)發(fā)布/訂閱模式。發(fā)布者可以把消息發(fā)布到消息交換器上而不用知道這些消息都有哪些訂閱者。

每一個訂閱了交換器的消費(fèi)者都會創(chuàng)建一個隊(duì)列;然后消息交換器會把生產(chǎn)的消息放入隊(duì)列以供消費(fèi)者消費(fèi)。消息交換器也可以基于各種路由規(guī)則為一些訂閱者過濾消息。

RabbitMQ消息交換器

需要重點(diǎn)注意的是RabbitMQ支持臨時和持久兩種訂閱類型。消費(fèi)者可以調(diào)用RabbitMQ的API來選擇他們想要的訂閱類型。

根據(jù)RabbitMQ的架構(gòu)設(shè)計(jì),我們也可以創(chuàng)建一種混合方法——訂閱者以組隊(duì)的方式然后在組內(nèi)以競爭關(guān)系作為消費(fèi)者去處理某個具體隊(duì)列上的消息,這種由訂閱者構(gòu)成的組我們稱為消費(fèi)者組。按照這種方式,我們實(shí)現(xiàn)了發(fā)布/訂閱模式,同時也能夠很好的伸縮(scale-up)訂閱者去處理收到的消息。

發(fā)布/訂閱與隊(duì)列的聯(lián)合使用

三、Apache Kafka

Apache Kafka不是消息中間件的一種實(shí)現(xiàn)。相反,它只是一種分布式流式系統(tǒng)。

不同于基于隊(duì)列和交換器的RabbitMQ,Kafka的存儲層是使用分區(qū)事務(wù)日志來實(shí)現(xiàn)的。Kafka也提供流式API用于實(shí)時的流處理以及連接器API用來更容易的和各種數(shù)據(jù)源集成;當(dāng)然,這些已經(jīng)超出了本篇文章的討論范圍。

云廠商為Kafka存儲層提供了可選的方案,比如Azure Event Hubsy以及AWS Kinesis Data Streams等。對于Kafka流式處理能力,還有一些特定的云方案和開源方案,不過,話說回來,它們也超出了本篇的范圍。

1、主題

Kafka沒有實(shí)現(xiàn)隊(duì)列這種東西。相應(yīng)的,Kafka按照類別存儲記錄集,并且把這種類別稱為主題。

Kafka為每個主題維護(hù)一個消息分區(qū)日志。每個分區(qū)都是由有序的不可變的記錄序列組成,并且消息都是連續(xù)的被追加在尾部。

當(dāng)消息到達(dá)時,Kafka就會把他們追加到分區(qū)尾部。默認(rèn)情況下,Kafka使用輪詢分區(qū)器(partitioner)把消息一致的分配到多個分區(qū)上。

Kafka可以改變創(chuàng)建消息邏輯流的行為。例如,在一個多租戶的應(yīng)用中,我們可以根據(jù)每個消息中的租戶ID創(chuàng)建消息流。IoT場景中,我們可以在常數(shù)級別下根據(jù)生產(chǎn)者的身份信息(identity)將其映射到一個具體的分區(qū)上。確保來自相同邏輯流上的消息映射到相同分區(qū)上,這就保證了消息能夠按照順序提供給消費(fèi)者。

Kafka生產(chǎn)者

消費(fèi)者通過維護(hù)分區(qū)的偏移(或者說索引)來順序的讀出消息,然后消費(fèi)消息。

單個消費(fèi)者可以消費(fèi)多個不同的主題,并且消費(fèi)者的數(shù)量可以伸縮到可獲取的最大分區(qū)數(shù)量。

所以在創(chuàng)建主題的時候,我們要認(rèn)真的考慮一下在創(chuàng)建的主題上預(yù)期的消息吞吐量。消費(fèi)同一個主題的多個消費(fèi)者構(gòu)成的組稱為消費(fèi)者組。通過Kafka提供的API可以處理同一消費(fèi)者組中多個消費(fèi)者之間的分區(qū)平衡以及消費(fèi)者當(dāng)前分區(qū)偏移的存儲。

Kafka消費(fèi)者

2、Kafka實(shí)現(xiàn)的消息模式

Kafka的實(shí)現(xiàn)很好地契合發(fā)布/訂閱模式。

生產(chǎn)者可以向一個具體的主題發(fā)送消息,然后多個消費(fèi)者組可以消費(fèi)相同的消息。每一個消費(fèi)者組都可以獨(dú)立的伸縮去處理相應(yīng)的負(fù)載。由于消費(fèi)者維護(hù)自己的分區(qū)偏移,所以他們可以選擇持久訂閱或者臨時訂閱,持久訂閱在重啟之后不會丟失偏移而臨時訂閱在重啟之后會丟失偏移并且每次重啟之后都會從分區(qū)中最新的記錄開始讀取。

但是這種實(shí)現(xiàn)方案不能完全等價的當(dāng)做典型的消息隊(duì)列模式看待。當(dāng)然,我們可以創(chuàng)建一個主題,這個主題和擁有一個消費(fèi)者的消費(fèi)組進(jìn)行關(guān)聯(lián),這樣我們就模擬出了一個典型的消息隊(duì)列。不過這會有許多缺點(diǎn),我們會在第二部分詳細(xì)討論。

值得特別注意的是,Kafka是按照預(yù)先配置好的時間保留分區(qū)中的消息,而不是根據(jù)消費(fèi)者是否消費(fèi)了這些消息。這種保留機(jī)制可以讓消費(fèi)者自由的重讀之前的消息。另外,開發(fā)者也可以利用Kafka的存儲層來實(shí)現(xiàn)諸如事件溯源和日志審計(jì)功能。

盡管有時候RabbitMQ和Kafka可以當(dāng)做等價來看,但是他們的實(shí)現(xiàn)是非常不同的。所以我們不能把他們當(dāng)做同種類的工具來看待;一個是消息中間件,另一個是分布式流式系統(tǒng)。

作為解決方案架構(gòu)師,我們要能夠認(rèn)識到它們之間的差異并且盡可能的考慮在給定場景中使用哪種類型的解決方案。下面會指出這些差異并且提供什么時候使用哪種方案的指導(dǎo)建議。

四、RabbitMQ和Kafka的顯著差異

RabbitMQ是一個消息代理,但是Apache Kafka是一個分布式流式系統(tǒng)。好像從語義上就可以看出差異,但是它們內(nèi)部的一些特性會影響到我們是否能夠很好的設(shè)計(jì)各種用例。

例如,Kafka最適用于數(shù)據(jù)的流式處理,但是RabbitMQ對流式中的消息就很難保持它們的順序。

另一方面,RabbitMQ內(nèi)置重試邏輯和死信(dead-letter)交換器,但是Kafka只是把這些實(shí)現(xiàn)邏輯交給用戶來處理。

這部分主要強(qiáng)調(diào)在不同系統(tǒng)之間它們的主要差異。

1、消息順序

對于發(fā)送到隊(duì)列或者交換器上的消息,RabbitMQ不保證它們的順序。盡管消費(fèi)者按照順序處理生產(chǎn)者發(fā)來的消息看上去很符合邏輯,但是這有很大誤導(dǎo)性。

RabbitMQ文檔中有關(guān)于消息順序保證的說明:

“發(fā)布到一個通道(channel)上的消息,用一個交換器和一個隊(duì)列以及一個出口通道來傳遞,那么最終會按照它們發(fā)送的順序接收到。” 

——RabbitMQ代理語義(Broker Semantics)

換話句話說,只要我們是單個消費(fèi)者,那么接收到的消息就是有序的。然而,一旦有多個消費(fèi)者從同一個隊(duì)列中讀取消息,那么消息的處理順序就沒法保證了。

由于消費(fèi)者讀取消息之后可能會把消息放回(或者重傳)到隊(duì)列中(例如,處理失敗的情況),這樣就會導(dǎo)致消息的順序無法保證。

一旦一個消息被重新放回隊(duì)列,另一個消費(fèi)者可以繼續(xù)處理它,即使這個消費(fèi)者已經(jīng)處理到了放回消息之后的消息。因此,消費(fèi)者組處理消息是無序的,如下表所示:

使用RabbitMQ丟失消息順序的例子

當(dāng)然,我們可以通過限制消費(fèi)者的并發(fā)數(shù)等于1來保證RabbitMQ中的消息有序性。更準(zhǔn)確點(diǎn)說,限制單個消費(fèi)者中的線程數(shù)為1,因?yàn)槿魏蔚牟⑿邢⑻幚矶紩?dǎo)致無序問題。

不過,隨著系統(tǒng)規(guī)模增長,單線程消費(fèi)者模式會嚴(yán)重影響消息處理能力。所以,我們不要輕易的選擇這種方案。

另一方面,對于Kafka來說,它在消息處理方面提供了可靠的順序保證。Kafka能夠保證發(fā)送到相同主題分區(qū)的所有消息都能夠按照順序處理。

在前面說過,默認(rèn)情況下,Kafka會使用循環(huán)分區(qū)器(round-robin partitioner)把消息放到相應(yīng)的分區(qū)上。不過,生產(chǎn)者可以給每個消息設(shè)置分區(qū)鍵(key)來創(chuàng)建數(shù)據(jù)邏輯流(比如來自同一個設(shè)備的消息,或者屬于同一租戶的消息)。

所有來自相同流的消息都會被放到相同的分區(qū)中,這樣消費(fèi)者組就可以按照順序處理它們。

但是,我們也應(yīng)該注意到,在同一個消費(fèi)者組中,每個分區(qū)都是由一個消費(fèi)者的一個線程來處理。結(jié)果就是我們沒法伸縮(scale)單個分區(qū)的處理能力。

不過,在Kafka中,我們可以伸縮一個主題中的分區(qū)數(shù)量,這樣可以讓每個分區(qū)分擔(dān)更少的消息,然后增加更多的消費(fèi)者來處理額外的分區(qū)。

獲勝者(Winner):

顯而易見,Kafka是獲勝者,因?yàn)樗梢员WC按順序處理消息。RabbitMQ在這塊就相對比較弱。

2、消息路由

RabbitMQ可以基于定義的訂閱者路由規(guī)則路由消息給一個消息交換器上的訂閱者。一個主題交換器可以通過一個叫做routing_key的特定頭來路由消息。

或者,一個頭部(headers)交換器可以基于任意的消息頭來路由消息。這兩種交換器都能夠有效地讓消費(fèi)者設(shè)置他們感興趣的消息類型,因此可以給解決方案架構(gòu)師提供很好的靈活性。

另一方面,Kafka在處理消息之前是不允許消費(fèi)者過濾一個主題中的消息。一個訂閱的消費(fèi)者在沒有異常情況下會接受一個分區(qū)中的所有消息。

作為一個開發(fā)者,你可能使用Kafka流式作業(yè)(job),它會從主題中讀取消息,然后過濾,最后再把過濾的消息推送到另一個消費(fèi)者可以訂閱的主題。但是,這需要更多的工作量和維護(hù),并且還涉及到更多的移動操作。

獲勝者:

在消息路由和過濾方面,RabbitMQ提供了更好的支持。

3、消息時序(timing)

在測定發(fā)送到一個隊(duì)列的消息時間方面,RabbitMQ提供了多種能力:

1)消息存活時間(TTL)

發(fā)送到RabbitMQ的每條消息都可以關(guān)聯(lián)一個TTL屬性。發(fā)布者可以直接設(shè)置TTL或者根據(jù)隊(duì)列的策略來設(shè)置。

系統(tǒng)可以根據(jù)設(shè)置的TTL來限制消息的有效期。如果消費(fèi)者在預(yù)期時間內(nèi)沒有處理該消息,那么這條消息會自動的從隊(duì)列上被移除(并且會被移到死信交換器上,同時在這之后的消息都會這樣處理)。

TTL對于那些有時效性的命令特別有用,因?yàn)橐欢螘r間內(nèi)沒有處理的話,這些命令就沒有什么意義了。

2)延遲/預(yù)定的消息

RabbitMQ可以通過插件的方式來支持延遲或者預(yù)定的消息。當(dāng)這個插件在消息交換器上啟用的時候,生產(chǎn)者可以發(fā)送消息到RabbitMQ上,然后這個生產(chǎn)者可以延遲RabbitMQ路由這個消息到消費(fèi)者隊(duì)列的時間。

這個功能允許開發(fā)者調(diào)度將來(future)的命令,也就是在那之前不應(yīng)該被處理的命令。例如,當(dāng)生產(chǎn)者遇到限流規(guī)則時,我們可能會把這些特定的命令延遲到之后的一個時間執(zhí)行。

Kafka沒有提供這些功能。它在消息到達(dá)的時候就把它們寫入分區(qū)中,這樣消費(fèi)者就可以立即獲取到消息去處理。

Kafka也沒用為消息提供TTL的機(jī)制,不過我們可以在應(yīng)用層實(shí)現(xiàn)。

不過,我們必須要記住的一點(diǎn)是Kafka分區(qū)是一種追加模式的事務(wù)日志。所以,它是不能處理消息時間(或者分區(qū)中的位置)。

獲勝者:

毫無疑問,RabbitMQ是獲勝者,因?yàn)檫@種實(shí)現(xiàn)天然的就限制Kafka。

4、消息留存(retention)

當(dāng)消費(fèi)者成功消費(fèi)消息之后,RabbitMQ就會把對應(yīng)的消息從存儲中刪除。這種行為沒法修改。它幾乎是所有消息代理設(shè)計(jì)的必備部分。

相反,Kafka會給每個主題配置超時時間,只要沒有達(dá)到超時時間的消息都會保留下來。在消息留存方面,Kafka僅僅把它當(dāng)做消息日志來看待,并不關(guān)心消費(fèi)者的消費(fèi)狀態(tài)。

消費(fèi)者可以不限次數(shù)的消費(fèi)每條消息,并且他們可以操作分區(qū)偏移來“及時”往返的處理這些消息。Kafka會周期的檢查分區(qū)中消息的留存時間,一旦消息超過設(shè)定保留的時長,就會被刪除。

Kafka的性能不依賴于存儲大小。所以,理論上,它存儲消息幾乎不會影響性能(只要你的節(jié)點(diǎn)有足夠多的空間保存這些分區(qū))。

獲勝者:

Kafka設(shè)計(jì)之初就是保存消息的,但是RabbitMQ并不是。所以這塊沒有可比性,Kafka是獲勝者。推薦:最全面的Java面試大綱及答案解析

5、容錯處理

當(dāng)處理消息,隊(duì)列和事件時,開發(fā)者常常認(rèn)為消息處理總是成功的。畢竟,生產(chǎn)者把每條消息放入隊(duì)列或者主題后,即使消費(fèi)者處理消息失敗了,它僅僅需要做的就是重新嘗試,直到成功為止。

盡管表面上看這種方法是沒錯的,但是我們應(yīng)該對這種處理方式多思考一下。首先我們應(yīng)該承認(rèn),在某些場景下,消息處理會失敗。所以,即使在解決方案部分需要人為干預(yù)的情況下,我們也要妥善地處理這些情況。

消息處理存在兩種可能的故障:

1)瞬時故障——故障產(chǎn)生是由于臨時問題導(dǎo)致,比如網(wǎng)絡(luò)連接,CPU負(fù)載,或者服務(wù)崩潰。我們可以通過一遍又一遍的嘗試來減輕這種故障。

2)持久故障——故障產(chǎn)生是由于永久的問題導(dǎo)致的,并且這種問題不能通過額外的重試來解決。比如常見的原因有軟件bug或者無效的消息格式(例如,損壞(poison)的消息)。

作為架構(gòu)師和開發(fā)者,我們應(yīng)該問問自己:“對于消息處理故障,我們應(yīng)該重試多少次?每一次重試之間我們應(yīng)該等多久?我們怎樣區(qū)分瞬時和持久故障?”

最重要的是:“所有重試都失敗后或者遇到一個持久的故障,我們要做什么?”

當(dāng)然,不同業(yè)務(wù)領(lǐng)域有不同的回答,消息系統(tǒng)一般會給我們提供工具讓我們自己實(shí)現(xiàn)解決方案。

RabbitMQ會給我們提供諸如交付重試和死信交換器(DLX)來處理消息處理故障。

DLX的主要思路是根據(jù)合適的配置信息自動地把路由失敗的消息發(fā)送到DLX,并且在交換器上根據(jù)規(guī)則來進(jìn)一步的處理,比如異常重試,重試計(jì)數(shù)以及發(fā)送到“人為干預(yù)”的隊(duì)列。

查看下面篇文章,它在RabbitMQ處理重試上提供了額外的可能模式視角。

鏈接:https://engineering.nanit.com/rabbitmq-retries-the-full-story-ca4cc6c5b493

在RabbitMQ中我們需要記住最重要的事情是當(dāng)一個消費(fèi)者正在處理或者重試某個消息時(即使是在把它返回隊(duì)列之前),其他消費(fèi)者都可以并發(fā)的處理這個消息之后的其他消息。

當(dāng)某個消費(fèi)者在重試處理某條消息時,作為一個整體的消息處理邏輯不會被阻塞。所以,一個消費(fèi)者可以同步地去重試處理一條消息,不管花費(fèi)多長時間都不會影響整個系統(tǒng)的運(yùn)行。

消費(fèi)者1持續(xù)的在重試處理消息1,同時其他消費(fèi)者可以繼續(xù)處理其他消息

和RabbitMQ相反,Kafka沒有提供這種開箱即用的機(jī)制。在Kafka中,需要我們自己在應(yīng)用層提供和實(shí)現(xiàn)消息重試機(jī)制。

另外,我們需要注意的是當(dāng)一個消費(fèi)者正在同步地處理一個特定的消息時,那么同在這個分區(qū)上的其他消息是沒法被處理的。

由于消費(fèi)者不能改變消息的順序,所以我們不能夠拒絕和重試一個特定的消息以及提交一個在這個消息之后的消息。你只要記住,分區(qū)僅僅是一個追加模式的日志。

一個應(yīng)用層解決方案可以把失敗的消息提交到一個“重試主題”,并且從那個主題中處理重試;但是這樣的話我們就會丟失消息的順序。

我們可以在Uber.com上找到Uber工程師實(shí)現(xiàn)的一個例子。如果消息處理的時延不是關(guān)注點(diǎn),那么對錯誤有足夠監(jiān)控的Kafka方案可能就足夠了。

如果消費(fèi)者阻塞在重試一個消息上,那么底部分區(qū)的消息就不會被處理

獲勝者:

RabbitMQ是獲勝者,因?yàn)樗峁┝艘粋€解決這個問題的開箱即用的機(jī)制。

6、伸縮

有多個基準(zhǔn)測試,用于檢查RabbitMQ和Kafka的性能。

盡管通用的基準(zhǔn)測試對一些特定的情況會有限制,但是Kafka通常被認(rèn)為比RabbitMQ有更優(yōu)越的性能。

Kafka使用順序磁盤I / O來提高性能。

從Kafka使用分區(qū)的架構(gòu)上看,它在橫向擴(kuò)展上會優(yōu)于RabbitMQ,當(dāng)然RabbitMQ在縱向擴(kuò)展上會有更多的優(yōu)勢。

Kafka的大規(guī)模部署通常每秒可以處理數(shù)十萬條消息,甚至每秒百萬級別的消息。

過去,Pivotal記錄了一個Kafka集群每秒處理一百萬條消息的例子;但是,它是在一個有著30個節(jié)點(diǎn)集群上做的,并且這些消息負(fù)載被優(yōu)化分散到多個隊(duì)列和交換器上。

鏈接:https://content.pivotal.io/blog/rabbitmq-hits-one-million-messages-per-second-on-google-compute-engine

典型的RabbitMQ部署包含3到7個節(jié)點(diǎn)的集群,并且這些集群也不需要把負(fù)載分散到不同的隊(duì)列上。這些典型的集群通常可以預(yù)期每秒處理幾萬條消息。

獲勝者:

盡管這兩個消息平臺都可以處理大規(guī)模負(fù)載,但是Kafka在伸縮方面更優(yōu)并且能夠獲得比RabbitMQ更高的吞吐量,因此這局Kafka獲勝。

但是,值得注意的是大部分系統(tǒng)都還沒有達(dá)到這些極限!所以,除非你正在構(gòu)建下一個非常受歡迎的百萬級用戶軟件系統(tǒng),否則你不需要太關(guān)心伸縮性問題,畢竟這兩個消息平臺都可以工作的很好。

7、消費(fèi)者復(fù)雜度

RabbitMQ使用的是智能代理和傻瓜式消費(fèi)者模式。消費(fèi)者注冊到消費(fèi)者隊(duì)列,然后RabbitMQ把傳進(jìn)來的消息推送給消費(fèi)者。RabbitMQ也有拉取(pull)API;不過,一般很少被使用。

RabbitMQ管理消息的分發(fā)以及隊(duì)列上消息的移除(也可能轉(zhuǎn)移到DLX)。消費(fèi)者不需要考慮這塊。

根據(jù)RabbitMQ結(jié)構(gòu)的設(shè)計(jì),當(dāng)負(fù)載增加的時候,一個隊(duì)列上的消費(fèi)者組可以有效的從僅僅一個消費(fèi)者擴(kuò)展到多個消費(fèi)者,并且不需要對系統(tǒng)做任何的改變。

RabbitMQ高效的伸縮

相反,Kafka使用的是傻瓜式代理和智能消費(fèi)者模式。消費(fèi)者組中的消費(fèi)者需要協(xié)調(diào)他們之間的主題分區(qū)租約(以便一個具體的分區(qū)只由消費(fèi)者組中一個消費(fèi)者監(jiān)聽)。

消費(fèi)者也需要去管理和存儲他們分區(qū)偏移索引。幸運(yùn)的是Kafka SDK已經(jīng)為我們封裝了,所以我們不需要自己管理。

另外,當(dāng)我們有一個低負(fù)載時,單個消費(fèi)者需要處理并且并行的管理多個分區(qū),這在消費(fèi)者端會消耗更多的資源。

當(dāng)然,隨著負(fù)載增加,我們只需要伸縮消費(fèi)者組使其消費(fèi)者的數(shù)量等于主題中分區(qū)的數(shù)量。這就需要我們配置Kafka增加額外的分區(qū)。

但是,隨著負(fù)載再次降低,我們不能移除我們之前增加的分區(qū),這需要給消費(fèi)者增加更多的工作量。盡管這樣,但是正如我們上面提到過,Kafka SDK已經(jīng)幫我們做了這個額外的工作。

Kafka分區(qū)沒法移除,向下伸縮后消費(fèi)者會做更多的工作

獲勝者:

根據(jù)設(shè)計(jì),RabbitMQ就是為了傻瓜式消費(fèi)者而構(gòu)建的。所以這輪RabbitMQ獲勝。

五、如何選擇?

現(xiàn)在我們就如面對百萬美元問題一樣:“什么時候使用RabbitMQ以及什么時候使用Kafka?”概括上面的差異,我們不難得出下面的結(jié)論。

優(yōu)先選擇RabbitMQ的條件:

  •  高級靈活的路由規(guī)則;
  •  消息時序控制(控制消息過期或者消息延遲);
  •  高級的容錯處理能力,在消費(fèi)者更有可能處理消息不成功的情景中(瞬時或者持久);
  •  更簡單的消費(fèi)者實(shí)現(xiàn)。

優(yōu)先選擇Kafka的條件:

  •  嚴(yán)格的消息順序;
  •  延長消息留存時間,包括過去消息重放的可能;
  •  傳統(tǒng)解決方案無法滿足的高伸縮能力。

大部分情況下這兩個消息平臺都可以滿足我們的要求。但是,它取決于我們的架構(gòu)師,他們會選擇最合適的工具。當(dāng)做決策的時候,我們需要考慮上面著重強(qiáng)調(diào)的功能性差異和非功能性限制。

這些限制如下:

  •  當(dāng)前開發(fā)者對這兩個消息平臺的了解;
  •  托管云解決方案的可用性(如果適用);
  •  每種解決方案的運(yùn)營成本;
  •  適用于我們目標(biāo)棧的SDK的可用性。

當(dāng)開發(fā)復(fù)雜的軟件系統(tǒng)時,我們可能被誘導(dǎo)使用同一個消息平臺去實(shí)現(xiàn)所有必須的消息用例。但是,從我的經(jīng)驗(yàn)看,通常同時使用這兩個消息平臺能夠帶來更多的好處。

例如,在一個事件驅(qū)動的架構(gòu)系統(tǒng)中,我們可以使用RabbitMQ在服務(wù)之間發(fā)送命令,并且使用Kafka實(shí)現(xiàn)業(yè)務(wù)事件通知。

原因是事件通知常常用于事件溯源,批量操作(ETL風(fēng)格),或者審計(jì)目的,因此Kafka的消息留存能力就顯得很有價值。

相反,命令一般需要在消費(fèi)者端做額外處理,并且處理可以失敗,所以需要高級的容錯處理能力。

這里,RabbitMQ在功能上有很多閃光點(diǎn)。以后我可能會寫一篇詳細(xì)的文章來介紹,但是你必須記住--你的里程(mileage)可能會變化,因?yàn)檫m合性取決于你的特定需求。

六、總結(jié)思想

寫這篇文章是由于我觀察到許多開發(fā)者把這RabbitMQ和Kafka作為等價來看待。我希望通過這篇文章的幫助能夠讓你獲得對這兩種技術(shù)實(shí)現(xiàn)的深刻理解以及它們之間的技術(shù)差異。

反過來通過它們之間的差異來影響這兩個平臺去給用例提供更好的服務(wù)。這兩個消息平臺都很棒,并且都能夠給多個用例提供很好的服務(wù)。

但是,作為解決方案架構(gòu)師,取決于我們對每一個用例需求的理解,以及優(yōu)化,然后選擇最合適的解決方案。 

 

責(zé)任編輯:龐桂玉 來源: Java知音
相關(guān)推薦

2020-02-20 16:45:39

RabbitMQKafka架構(gòu)

2020-03-24 07:40:00

RabbitMQKafka架構(gòu)師

2024-11-20 15:43:27

2020-09-01 07:22:04

網(wǎng)絡(luò)戰(zhàn)武器系統(tǒng)網(wǎng)絡(luò)安全

2019-05-21 14:14:18

KafkaRabbitMQRocketMQ

2019-09-18 15:22:52

消息中間件RabbitMQ

2020-04-03 08:30:44

RabbitMQKafka軟件

2021-08-30 11:36:23

微服務(wù)開發(fā)技術(shù)

2024-01-25 18:00:56

微服務(wù)系統(tǒng)KafkaRabbitMQ

2021-07-02 10:43:52

IT人才首席信息官人才招聘

2019-05-29 14:49:02

KafkaRocketMQRabbitMQ

2023-03-10 08:00:03

KafkaActiveMQ

2023-09-06 14:11:03

數(shù)據(jù)庫Redis消息隊(duì)列

2024-04-03 11:36:09

KafkaRabbitMQ架構(gòu)

2022-02-13 23:04:28

RedisRabbitMQKafka

2017-12-25 14:49:31

CDN牌照互聯(lián)網(wǎng)

2017-05-15 09:55:07

2014-11-26 17:15:53

2019-04-11 10:26:15

架構(gòu)運(yùn)維技術(shù)

2023-10-24 07:50:18

消息中間件MQ
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

国内在线免费视频| 国产又爽又黄免费软件| 在线看成人短视频| 欧美写真视频网站| www亚洲国产| 欧美一级做性受免费大片免费| 国产亚洲欧洲| 日韩在线中文字幕| 久久福利小视频| 91综合国产| 亚洲午夜久久久久久久久电影院 | 亚洲一区在线观| 欧美aⅴ99久久黑人专区| 日韩精品中文字幕在线观看| 久久人人爽av| 日本在线啊啊| 1024成人网色www| 蜜桃传媒视频麻豆第一区免费观看| 亚洲专区在线播放| 一区二区国产精品| 久久国产精彩视频| 免费看污片的网站| 成人自拍在线| 欧美精品在线一区二区| 欧美色图色综合| caopeng在线| 欧美激情综合在线| 精品一区二区国产| 精品人妻无码一区二区| 蜜臀久久99精品久久久久久9| 午夜精品久久久久久久99黑人 | 国产精品91一区二区三区| 亚洲成人精品视频| 中国老熟女重囗味hdxx| 国产精品伦一区二区| 黑人狂躁日本妞一区二区三区| av 日韩 人妻 黑人 综合 无码| 国产福利在线观看| 99精品1区2区| 国产综合动作在线观看| 国产高清不卡视频| 国产在线视频一区二区| 国产精品久久久久久久久久久新郎 | 日本新janpanese乱熟| 成人免费网站观看| 亚洲精品国产第一综合99久久| 性欧美精品一区二区三区在线播放 | 中文字幕在线官网| 亚洲超碰97人人做人人爱| 色哟哟免费网站| 精品麻豆一区二区三区| 国产精品欧美综合在线| 午夜精品一区二区在线观看的 | 久久人人爽人人爽人人片亚洲| 一区二区三区在线观看免费视频| 亚洲瘦老头同性70tv| 亚洲国产小视频| 亚洲国产精品成人综合久久久| jizz性欧美2| 亚洲成人网av| 亚洲永久无码7777kkk| 欧美人体视频| 亚洲人成在线播放| 日本二区在线观看| 日韩精品免费| 久久韩剧网电视剧| 国产精品老熟女一区二区| 欧美韩国一区| 久久久久久亚洲精品不卡| 日韩欧美亚洲国产| 国产精品日本| 日本欧美黄网站| 在线观看亚洲黄色| 久久电影国产免费久久电影 | 奇米影视777在线欧美电影观看| 亚洲成人av在线| 精品黑人一区二区三区观看时间| 亚洲免费福利一区| 中文字幕久精品免费视频| 九九热视频在线免费观看| 亚洲欧洲美洲一区二区三区| 色综合久综合久久综合久鬼88| 亚洲国产综合久久| 手机精品视频在线观看| 成人精品久久久| 国产黄色免费大片| 91麻豆精品在线观看| 日本精品一区二区| 在线黄色网页| 欧美性猛xxx| 欧美日韩精品区别| 欧美wwwwww| 日韩中文字幕久久| 日韩黄色a级片| 蜜臀va亚洲va欧美va天堂| 亚洲自拍偷拍色片视频| 天堂中文在线资| 中文字幕在线不卡视频| 国产av人人夜夜澡人人爽麻豆| 欧美电影网址| 欧美sm美女调教| 亚洲一区 欧美| 亚洲小说欧美另类社区| 国产精品美女999| 三级视频在线看| 国产精品不卡在线| 欧美成人一区二区在线观看| 四虎精品在线观看| 亚洲欧美另类自拍| 国产亚洲精品成人| 久久精品国产久精国产| 久久本道综合色狠狠五月| 欧美激情办公室videoshd| 欧美日韩亚洲天堂| 极品白嫩少妇无套内谢| 色婷婷色综合| 日韩美女视频免费看| 亚洲AV无码国产精品午夜字幕 | 亚洲老头同性xxxxx| 亚洲一二三在线观看| 久久亚洲欧美| 精品综合在线| 九色91在线| 91精品国产色综合久久久蜜香臀| 色婷婷av777| 日韩午夜激情| 成人免费观看网站| 男人天堂手机在线| 在线观看91视频| 国产乱了高清露脸对白| 黄色成人在线网站| 亚洲xxxx18| 欧美jizz18性欧美| 欧美视频自拍偷拍| 亚洲综合色一区| 午夜亚洲视频| 精品欧美一区二区在线观看视频 | 国产一区二区影视| 欧美日韩视频免费播放| 亚洲成人av免费观看| 97视频热人人精品免费| 国产精品嫩草影院久久久| 精品三级久久久久久久电影聊斋| 欧美午夜www高清视频| 星空大象在线观看免费播放| 亚洲国产精品第一区二区| 岛国视频一区| av丝袜在线| 亚洲第一av在线| 黄色激情视频在线观看| 国产.欧美.日韩| 白白操在线视频| 超碰成人97| 午夜精品久久久久久99热软件| 国产 日韩 欧美 精品| 亚洲国产美女搞黄色| 日本一区二区在线观看视频| 精品成人免费| 麻豆av福利av久久av| 亚洲欧美小说色综合小说一区| 日韩高清有码在线| 无码人妻一区二区三区免费| 国产日韩精品久久久| 美女网站色免费| 欧美高清视频手机在在线| 91精品视频在线看| 丝袜中文在线| 日韩成人在线视频网站| 无码人妻精品一区二| 国产精品美日韩| 杨幂一区二区国产精品| 99精品免费| 日韩三级电影免费观看| 国产高清亚洲| 高清视频欧美一级| 黄色电影免费在线看| 欧美日韩久久久久久| 青青草成人免费| 99国内精品久久| www.com黄色片| 欧美激情视频一区二区三区免费| 国产精品一区二区三区精品| 亚洲天堂资源| www.亚洲成人| 人妻妺妺窝人体色www聚色窝| 欧美日韩美女在线| 182在线观看视频| 成人性视频免费网站| 亚洲精品无码久久久久久| 日韩精品免费一区二区在线观看 | 秋霞成人午夜鲁丝一区二区三区| аⅴ资源新版在线天堂| 欧美一二三四在线| 男人午夜免费视频| 亚洲天堂精品在线观看| 亚洲天堂美女视频| 久久av老司机精品网站导航| 国产色一区二区三区| 日本不卡电影| 成人综合电影| 色综合一区二区日本韩国亚洲 | 免费看污视频的网站| 亚洲三级视频在线观看| 在线观看国产网站| 精品一区二区三区免费观看| 国产高清av在线播放| 久久亚洲成人| 久久国产精品一区二区三区| 成人免费黄色| 91精品国产成人| 好了av在线| 国产香蕉一区二区三区在线视频| 亚洲AV无码一区二区三区少妇 | 午夜精品视频在线| 日韩毛片久久久| 日韩精品www| www.日韩高清| 欧美日韩免费不卡视频一区二区三区| 久草视频在线免费看| 国产精品美女久久久久久久久| 午夜av免费看| 国产不卡视频一区| 欧美视频国产视频| 日韩精品乱码av一区二区| 男人插女人视频在线观看| 欧美1区2区| 亚洲第一综合网站| 精品国产aⅴ| 久久影院理伦片| 久久九九热re6这里有精品| 92福利视频午夜1000合集在线观看| 唐人社导航福利精品| 国内精品模特av私拍在线观看| 成视频免费观看在线看| 色噜噜亚洲精品中文字幕| 国产一区二区三区福利| 亚洲精品一区二区网址| 婷婷在线观看视频| 亚洲国产精品久久久久秋霞不卡| 精品黑人一区二区三区国语馆| 欧美精品vⅰdeose4hd| 在线观看亚洲一区二区| 欧美性大战久久久久久久| 无码任你躁久久久久久久| 精品久久久久久久久中文字幕| 中文字幕一区二区三区手机版| 亚洲一区在线视频观看| 久久黄色免费网站| 一个色妞综合视频在线观看| 青青草免费av| 一区二区三区日本| 精品视频一区二区在线观看| 亚洲精品伦理在线| 久久一区二区三| 亚洲一区影音先锋| 国产在线拍揄自揄拍| 亚洲影院在线观看| 日韩三级视频在线| 岛国av午夜精品| 超碰在线观看91| 欧美男男青年gay1069videost | 亚洲国产精品va在线看黑人| 蜜桃视频久久一区免费观看入口| 精品国一区二区三区| 黄频网站在线观看| 亚洲黄色片网站| 国产黄在线观看| 精品久久久91| av美女在线观看| 日本成人免费在线| 国产69精品久久久久9999人| 成人黄色大片在线免费观看| 久久一级大片| 国产一区二区三区色淫影院| 欧美极品在线观看| 一本一生久久a久久精品综合蜜| 天天天综合网| 日本欧美视频在线观看| 久久国产欧美| 在线播放av中文字幕| 成人动漫一区二区| 亚洲图片另类小说| 亚洲另类一区二区| 男人的天堂一区| 欧美探花视频资源| www.蜜臀av| 亚洲日韩中文字幕在线播放| 日韩精品黄色| 97涩涩爰在线观看亚洲| 91精品国产66| 国产91免费视频| 不卡一区综合视频| 国产乱子伦精品无码专区| 国产一区成人| 欧美国产日韩另类| 91一区二区三区在线观看| 久久av红桃一区二区禁漫| 亚洲国产精品自拍| 中文亚洲av片在线观看| 欧美电视剧在线看免费| av电影在线播放高清免费观看| 欧美激情综合亚洲一二区| 日韩成人动漫| 国产区欧美区日韩区| 秋霞欧美视频| 一本大道熟女人妻中文字幕在线 | 日本黄区免费视频观看| 午夜影视日本亚洲欧洲精品| 亚洲专区在线播放| 亚洲欧洲av一区二区| 秋霞在线午夜| 国产日韩在线播放| 亚洲人成网www| 日本中文字幕在线视频观看| 久久综合综合久久综合| 免费看黄色的视频| 精品女厕一区二区三区| 国产v片在线观看| 日韩在线视频免费观看高清中文| free性护士videos欧美| 91成人免费在线观看| 日韩久久视频| 国产一级片黄色| 99国产精品久久| 免费在线观看av网址| 欧美日韩的一区二区| 福利在线视频导航| 日本高清视频一区| 欧美91在线| 夜夜添无码一区二区三区| 国产传媒日韩欧美成人| 最新日韩免费视频| 欧美性色欧美a在线播放| 欧美白人做受xxxx视频| 91国内精品久久| 精品国产乱子伦一区二区| 成人免费网站入口| 国产盗摄一区二区三区| 青青草原免费观看| 日韩欧美不卡一区| 亚洲电影视频在线| 99国产在线| 精品白丝av| 香港三级日本三级| 香蕉av福利精品导航| 神马一区二区三区| 97视频在线观看免费高清完整版在线观看 | 激情久久久久久久| 日本一区二区免费视频| 亚洲一二三专区| 欧美亚洲精品在线观看| 久久久久久有精品国产| 狠狠久久伊人| 浮妇高潮喷白浆视频| 91麻豆精品秘密| 亚洲高清视频免费观看| 中文字幕不卡av| 成人51免费| 18黄暴禁片在线观看| av在线不卡电影| 丁香社区五月天| 中文字幕日韩视频| 一区在线不卡| 青青草视频国产| 99久久精品免费看| 黄色一级视频免费看| 在线日韩日本国产亚洲| 欧美一级免费| 青草网在线观看| 久久久亚洲午夜电影| 中文字幕一区二区三区波野结 | 国产亚洲欧洲黄色| 免费一级欧美在线观看视频| 国产人妻互换一区二区| 成人激情视频网站| 久久久久久在线观看| 日韩有码在线视频| jizz久久精品永久免费| 日批视频在线免费看| 国产精品久久久久久福利一牛影视 | 91精品久久久久久粉嫩| 黄色99视频| 日本免费在线视频不卡一不卡二| 国产suv精品一区二区68| 亚洲精品一区二区三区福利 | 99久久99久久| 国产日韩欧美三区| 国产精品麻豆免费版现看视频| 日韩欧美第一区| 在线成人视屏| 奇米777四色影视在线看| 久久亚洲精品国产精品紫薇| 国产美女无遮挡永久免费| 992tv成人免费视频| 首页国产精品| 国产二级一片内射视频播放| 在线亚洲精品福利网址导航| 欧美精品videosex| 亚洲国产精品日韩| kk眼镜猥琐国模调教系列一区二区|