溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Kafka 里面的信息是如何被消費(fèi)的

發(fā)布時(shí)間:2021-12-15 11:57:52 來源:億速云 閱讀:100 作者:柒染 欄目:開發(fā)技術(shù)

今天就跟大家聊聊有關(guān)Kafka 里面的信息是如何被消費(fèi)的,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

使用 Kafka 很容易,但對 Kafka 集群進(jìn)行搭建、維護(hù)與調(diào)優(yōu)很麻煩。Kafka  集群需要有專人來維護(hù),不要以為你能輕易勝任這個(gè)工作?!毕旅鎸?Kafka  的一些術(shù)語會(huì)使用一些不太準(zhǔn)確但能表明意思的類比。

今天我們要討論的一個(gè)話題是,Kafka 是如何做到,對單個(gè)程序的多個(gè)進(jìn)程而言,能持續(xù)消費(fèi),斷點(diǎn)續(xù)傳和并行消費(fèi);對多個(gè)程序而言又互不影響,各自獨(dú)立。

一個(gè) Kafka 可以有多個(gè)不同的隊(duì)列,我們把這個(gè)隊(duì)列叫做Topic,假設(shè)其中一個(gè)隊(duì)列如下圖所示:

Kafka 里面的信息是如何被消費(fèi)的

信息從右邊進(jìn)去,從左邊出來。如果這是Redis 的列表,那么它彈出一條信息以后,隊(duì)列會(huì)變成下面這樣:

Kafka 里面的信息是如何被消費(fèi)的

最左邊的信息1不見了。所以即使程序在消費(fèi)了信息1后立刻關(guān)閉,再重新打開,程序也會(huì)接著從信息2開始消費(fèi),不會(huì)把信息1重復(fù)消費(fèi)兩次。

但我如果有兩個(gè)程序呢?程序1讀取每一條數(shù)據(jù),再轉(zhuǎn)存到數(shù)據(jù)庫。程序2讀取每一條數(shù)據(jù),再檢查是否有關(guān)鍵詞。這種情況下,信息1應(yīng)該能被程序1消費(fèi),也能被程序2消費(fèi)。但上面這種方案顯然是不行的。當(dāng)程序1消費(fèi)了信息1,程序2就再也拿不到它了。

所以,在 Kafka 里面,信息會(huì)停留在隊(duì)列里面,但對每一個(gè)程序來說,有一個(gè)單獨(dú)的記號,來記錄當(dāng)前消費(fèi)到了哪一條數(shù)據(jù),如下圖所示。

Kafka 里面的信息是如何被消費(fèi)的

當(dāng)程序1要讀取 Kafka 里面下一條數(shù)據(jù)時(shí),Kafka  先把當(dāng)前位置的標(biāo)記向右移動(dòng)一位,把新的這個(gè)值返回出來。標(biāo)記移動(dòng)與返回這兩個(gè)操作合在一起算是一個(gè)原子操作,不會(huì)出現(xiàn)重復(fù)讀取的問題。

程序1與程序2使用的是不同的標(biāo)記,所以各自的標(biāo)記指向哪個(gè)值,是互不影響的。

當(dāng)增加一個(gè)程序3的時(shí)候,只需要再加一個(gè)標(biāo)記即可。新的這個(gè)標(biāo)記也不受前兩個(gè)標(biāo)記的影響。

這就實(shí)現(xiàn)了在多個(gè)不同的程序讀取 Kafka 時(shí),各自互不影響。

現(xiàn)在如果你覺得程序1消費(fèi)太慢了,把程序1同時(shí)運(yùn)行了3次,那么由于標(biāo)記和移位是原子操作,即使你看起來程序是同時(shí)去讀取 Kafka,但在內(nèi)部 Kafka  也會(huì)對他們進(jìn)行“排隊(duì)”,從而使得他們返回的結(jié)果不重復(fù),不遺漏。

如果你在網(wǎng)上看 Kafka 的教程,你會(huì)發(fā)現(xiàn)他們提到了一個(gè)叫做 Offset 的東西,實(shí)際上就是本文所說的各個(gè)程序里面指向當(dāng)前數(shù)據(jù)的標(biāo)記。

你還會(huì)看到一個(gè)關(guān)鍵詞叫做Group,實(shí)際上對應(yīng)到本文的程序1,程序2和程序3。

對同一個(gè)隊(duì)列,如果多個(gè)程序使用不同的Group消費(fèi),那么他們讀取的數(shù)據(jù)就互不干擾。

對同一個(gè)隊(duì)列,相同 Group 的多個(gè)進(jìn)程在消費(fèi)數(shù)據(jù)時(shí),看起來就像是在對 Redis 進(jìn)行 lpop 操作一樣。

最后,你在網(wǎng)上關(guān)于 Kafka 的文章里面,一定會(huì)看到一個(gè)詞叫做Paritition或者中文分片。而且你會(huì)發(fā)現(xiàn)你無法理解這個(gè)東西。

沒關(guān)系,忘記它吧。你只需要知道,一個(gè) Topic 有多少個(gè) Partition,那么你最多能啟動(dòng)多少個(gè)進(jìn)程讀取同一個(gè)  Group。

如果一個(gè)Topic有3個(gè)Partition,那么你只能最多開3個(gè)進(jìn)程同時(shí)讀相同的  Group。Topic如果有5個(gè)Partition,那么你只能最多開5個(gè)進(jìn)程讀同一個(gè) Group。

看完上述內(nèi)容,你們對Kafka 里面的信息是如何被消費(fèi)的有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI