1. Kafka 消費(fèi)者是什么?
消費(fèi)者負(fù)責(zé)訂閱Kafka中的主題,并且從訂閱的主題上拉取消息。與其他一些消息中間件不同的是:在Kafka的消費(fèi)理念中還有一層消費(fèi)組的概念,每個(gè)消費(fèi)者都有一個(gè)對(duì)應(yīng)的消費(fèi)組。當(dāng)消息發(fā)布到主題后,只會(huì)被投遞給訂閱它的每個(gè)消費(fèi)組中的一個(gè)消費(fèi)者。
2. Kafka 消費(fèi)者組的概念?
假設(shè)我們有一個(gè)應(yīng)用程序,它從一個(gè)Kafka主題讀取消息,在對(duì)這些消息做一些驗(yàn)證后再把它們保存起來(lái)。應(yīng)用程序需要?jiǎng)?chuàng)建一個(gè)消費(fèi)者對(duì)象,訂閱主題并開(kāi)始接收消息、驗(yàn)證消息和保存結(jié)果。但過(guò)了一陣子,生產(chǎn)者向主題寫(xiě)入消息的速度超過(guò)了應(yīng)用程序驗(yàn)證數(shù)據(jù)的速度,這時(shí)候該怎么辦呢?如果只使用單個(gè)消費(fèi)者來(lái)處理消息,那么應(yīng)用程序會(huì)遠(yuǎn)遠(yuǎn)跟不上消息生成的速度。顯然,此時(shí)很有必要對(duì)消費(fèi)者進(jìn)行橫向伸縮。就像多個(gè)生產(chǎn)者可以向相同的主題寫(xiě)入消息一樣,也可以讓多個(gè)消費(fèi)者從同一個(gè)主題讀取消息。
Kafka消費(fèi)者從屬于消費(fèi)者群組。一個(gè)群組里的消費(fèi)者訂閱的是同一個(gè)主題,每個(gè)消費(fèi)者負(fù)責(zé)讀取這個(gè)主題的部分消息。
① 假設(shè)主題T1有4個(gè)分區(qū),我們創(chuàng)建了消費(fèi)者C1,它是群組G1中唯一的消費(fèi)者,用于訂閱主題T1。消費(fèi)者C1將收到主題T1全部4個(gè)分區(qū)的消息。
② 如果在群組G1里新增一個(gè)消費(fèi)者C2,那么每個(gè)消費(fèi)者將接收到兩個(gè)分區(qū)的消息。假設(shè)消費(fèi)者C1接收分區(qū)0和分區(qū)2的消息,消費(fèi)者C2接收分區(qū)1和分區(qū)3的消息。
③ 如果群組G1有4個(gè)消費(fèi)者,那么每個(gè)消費(fèi)者將可以分配到一個(gè)分區(qū)。
④ 如果向群組里添加更多的消費(fèi)者,以致超過(guò)了主題的分區(qū)數(shù)量,那么就會(huì)有一部分消費(fèi)者處于空閑狀態(tài),不會(huì)接收到任何消息。
向群組里添加消費(fèi)者是橫向擴(kuò)展數(shù)據(jù)處理能力的主要方式。Kafka消費(fèi)者經(jīng)常需要執(zhí)行一些高延遲的操作,比如把數(shù)據(jù)寫(xiě)到數(shù)據(jù)庫(kù)或用數(shù)據(jù)做一些比較耗時(shí)的計(jì)算。在這些情況下,單個(gè)消費(fèi)者無(wú)法跟上數(shù)據(jù)生成的速度,因此可以增加更多的消費(fèi)者來(lái)分擔(dān)負(fù)載,讓每個(gè)消費(fèi)者只處理部分分區(qū)的消息,這是橫向擴(kuò)展消費(fèi)者的主要方式。于是,我們可以為主題創(chuàng)建大量的分區(qū),當(dāng)負(fù)載急劇增長(zhǎng)時(shí),可以加入更多的消費(fèi)者。不過(guò)需要注意的是,不要讓消費(fèi)者的數(shù)量超過(guò)主題分區(qū)的數(shù)量,因?yàn)槎嘤嗟南M(fèi)者只會(huì)被閑置。
⑤ 除了通過(guò)增加消費(fèi)者數(shù)量來(lái)橫向伸縮單個(gè)應(yīng)用程序,我們還經(jīng)常遇到多個(gè)應(yīng)用程序從同一個(gè)主題讀取數(shù)據(jù)的情況。實(shí)際上,Kafka的一個(gè)主要設(shè)計(jì)目標(biāo)是讓Kafka主題里的數(shù)據(jù)能夠滿(mǎn)足企業(yè)各種應(yīng)用場(chǎng)景的需求。在這些應(yīng)用場(chǎng)景中,我們希望每一個(gè)應(yīng)用程序都能獲取到所有的消息,而不只是其中的一部分。只要保證每個(gè)應(yīng)用程序都有自己的消費(fèi)者群組就可以讓它們獲取到所有的消息。不同于傳統(tǒng)的消息系統(tǒng),橫向伸縮消費(fèi)者和消費(fèi)者群組并不會(huì)導(dǎo)致Kafka性能下降。
在之前的例子中,如果新增一個(gè)只包含一個(gè)消費(fèi)者的群組G2,那么這個(gè)消費(fèi)者將接收到主題T1的所有消息,與群組G1之間互不影響。群組G2可以增加更多的消費(fèi)者,每個(gè)消費(fèi)者會(huì)讀取若干個(gè)分區(qū),就像群組G1里的消費(fèi)者那樣。作為整體來(lái)說(shuō),群組G2還是會(huì)收到所有消息,不管有沒(méi)有其他群組存在。
總的來(lái)說(shuō),就是為每一個(gè)需要獲取主題全部消息的應(yīng)用程序創(chuàng)建一個(gè)消費(fèi)者群組,然后向群組里添加更多的消費(fèi)者來(lái)擴(kuò)展讀取能力和處理能力,讓群組里的每個(gè)消費(fèi)者只處理一部分消息。
3. Kafka 消費(fèi)者和消費(fèi)者組有什么關(guān)系?
消費(fèi)者組是一個(gè)邏輯上的概念,它將旗下的消費(fèi)者歸為一類(lèi),每一個(gè)消費(fèi)者只屬于一個(gè)消費(fèi)者組。每一個(gè)消費(fèi)組都會(huì)有一個(gè)固定的名稱(chēng),消費(fèi)者在進(jìn)行消費(fèi)前需要指定其所屬消費(fèi)者組的名稱(chēng),這個(gè)可以通過(guò)消費(fèi)者客戶(hù)端參數(shù)group.id來(lái)配置,默認(rèn)值為空字符串。 消費(fèi)者組內(nèi)每個(gè)消費(fèi)者負(fù)責(zé)消費(fèi)不同分區(qū)的數(shù)據(jù),一個(gè)分區(qū)只能由同一個(gè)消費(fèi)者組內(nèi)的一個(gè)消費(fèi)者來(lái)消費(fèi)。
消費(fèi)者組的作用是實(shí)現(xiàn)負(fù)載均衡和容錯(cuò)性,因?yàn)槊總€(gè)消費(fèi)者只能讀取主題中的一部分消息,而消費(fèi)者組中的所有消費(fèi)者共同讀取整個(gè)主題中的所有消息。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-644038.html
4. Kafka 多個(gè)消費(fèi)者如何同時(shí)消費(fèi)一個(gè)分區(qū)?
Kafka 中的每個(gè)分區(qū)只能被一個(gè)消費(fèi)者消費(fèi),如果多個(gè)Kafka消費(fèi)者要同時(shí)消費(fèi)相同主題下相同分區(qū)的數(shù)據(jù),需要將它們放到不同的消費(fèi)者組中。在Kafka中,一個(gè)消費(fèi)者組中的每個(gè)消費(fèi)者會(huì)消費(fèi)主題下不同分區(qū)的消息,而不同消費(fèi)者組中的消費(fèi)者則可以同時(shí)消費(fèi)相同分區(qū)的數(shù)據(jù)。這樣可以實(shí)現(xiàn)多個(gè)消費(fèi)者同時(shí)消費(fèi)相同分區(qū)的數(shù)據(jù),提高消費(fèi)效率和可靠性。同時(shí),Kafka還提供了一些負(fù)載均衡策略,可以根據(jù)消費(fèi)者組中消費(fèi)者的數(shù)量和消費(fèi)能力來(lái)自動(dòng)分配Partition,以實(shí)現(xiàn)更好的負(fù)載均衡。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-644038.html
到了這里,關(guān)于分布式 - 消息隊(duì)列Kafka:Kafka消費(fèi)者和消費(fèi)者組的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!