Kafka(分布式消息隊列)的基本認(rèn)識

作用(用于消息中間件)

1.可以作為緩沖(流量消減)--防止高并發(fā)

2.分布式

3.解耦合

分片機(jī)制

簡要介紹:

1.Kafka可以將主題劃分為多個分區(qū)(Partition)

2.主要解決了單臺服務(wù)器存儲容量有限的問題

3.將消息均勻的分布到不同的分區(qū)中,這樣實現(xiàn)了負(fù)載均衡.(提高讀寫效率)

生產(chǎn)者和消費者對分區(qū)的操作:

1.生產(chǎn)者和消費者可以多線程地并行操作,每一個線程處理的是一個分區(qū)的數(shù)據(jù),所以分區(qū)實際上是調(diào)優(yōu)Kafka并行度的最小單元.

2.生產(chǎn)者可以多線程同時向不同分區(qū)發(fā)送消息

3.消費者:同一個消費組內(nèi),一個分區(qū)可以被一個組中某一個成員消費,如果消費組中有多于分區(qū)數(shù)量的消費者,那么一定會有消費者無法消費數(shù)據(jù)。

4.一個topic分區(qū)越多,理論上整個集群所能達(dá)到的吞吐量就越大。但每個分區(qū)都有自己的資源占用開銷,分區(qū)多了,副本也多了,資源占用同樣也多了.

注意:kafka中的topic在消費時,整體上是無序的,而每個分區(qū)的內(nèi)部消費是有順序的,如果想要全局有序,可以設(shè)置一個分區(qū),但是這樣的話丟失了很多的性能。

如何合理的設(shè)置分區(qū)數(shù):

一個topic分區(qū)的個數(shù)不是隨意來來設(shè)置的,需要有些衡量的指標(biāo),可以使用如下方法進(jìn)行測試:

(1)、創(chuàng)建只有一個分區(qū)數(shù)的topic

(2)、然后測試這個topic的producer和consumer吞吐量

(3)、假設(shè)它們的值分別為Tp和Tc,單位可以是MB/s?

(4)、然后假設(shè)總的目標(biāo)吞吐量是Tt,那么分區(qū)數(shù)= Tt / max(Tp, Tc)

注意:

Tp表示producer的吞吐量。測試producer通常是很容易的,因為它的邏輯非常簡單,就是直接發(fā)送消息到Kafka就好了。Tp=10m/s

Tc表示consumer的吞吐量。測試Tc通常與應(yīng)用的關(guān)系更大,因為Tc的值取決于你拿到消息之后執(zhí)行什么操作,因此Tc的測試通常也要麻煩一些。Tc=5m/s總的目標(biāo)吞吐量是Tt,可以理解為說業(yè)務(wù)數(shù)據(jù)每秒實際產(chǎn)生的數(shù)據(jù)量100M

副本機(jī)制:

副本備份機(jī)制解決了數(shù)據(jù)存儲的高可用問題

容錯原則例子:

假設(shè)有三個分片, 三個副本, 共計9個節(jié)點

? 在三臺服務(wù)器上 各放置一個分片的副本

? 第二個副本放置在和這臺服務(wù)器同機(jī)架上

? 第三個副本放置在不同的機(jī)架的服務(wù)器上

消息不丟失機(jī)制:

生產(chǎn)者端消息不丟失:

1) 消息生產(chǎn)分為同步模式和異步模式

2)? 消息確認(rèn)分為三個狀態(tài)

? a) 參數(shù)0:生產(chǎn)者只負(fù)責(zé)發(fā)送數(shù)據(jù)

? b) 參數(shù)1:某個partition的leader收到數(shù)據(jù)給出響應(yīng)

? c) 參數(shù)-1:某個partition的所有副本都收到數(shù)據(jù)后給出響應(yīng)

3)? 在同步模式下

? a) 生產(chǎn)者等待10S,如果broker沒有給出ack響應(yīng),就認(rèn)為失敗。

? b) 生產(chǎn)者重試3次,如果還沒有響應(yīng),就報錯。

4)? 在異步模式下

? a) 先將數(shù)據(jù)保存在生產(chǎn)者端的buffer中。Buffer大小是2萬條。

? b) 滿足數(shù)據(jù)閾值或者數(shù)量閾值其中的一個條件就可以發(fā)送數(shù)據(jù)。

? c) 發(fā)送一批數(shù)據(jù)的大小是500條。

注意:異步模式下,如果broker遲遲不給ack,而buffer又滿了。開發(fā)者可以設(shè)置是否直接清空buffer中的數(shù)據(jù)。

broker端消息不丟失:

1.broker端的消息不丟失,其實就是用partition副本機(jī)制來保證。

2.Producer ack -1(all). 能夠保證所有的副本都同步好了數(shù)據(jù)。其中一臺機(jī)器掛了,并不影響數(shù)據(jù)的完整性。

消費端消息不丟失:

通過offset commit 來保證數(shù)據(jù)的不丟失,kafka自己記錄了每次消費的offset數(shù)值,下次繼續(xù)消費的時候,會接著上次的offset進(jìn)行消費。

生產(chǎn)者數(shù)據(jù)分發(fā)策略:

1.用戶指定partition

2. 當(dāng)用戶指定key,使用hash算法。如果key一直不變,同一個key算出來的hash值是個固定值。如果是固定值,這種hash取模就沒有意義。

3.當(dāng)用戶既沒有指定partition也沒有key,使用輪詢的方式發(fā)送數(shù)據(jù)。

消息的發(fā)布方式:

點對點的發(fā)布方式:只要保證所有接收這個topic的消費者都在同一組中

發(fā)布訂閱方式:只要保證所有接收這個topic的消費者不屬于同一組

面對數(shù)據(jù)量大,消費者消費慢的解決思路:

1.將同組中的消費者數(shù)量提高到這個topic分片的數(shù)量

2.若消費能力不足,可以將topic的分片數(shù)量擴(kuò)大

3.通過硬件提高消防者處理能力

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容