久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Kafka的基本概念該如何理解

177次閱讀
沒有評論

共計 2505 個字符,預計需要花費 7 分鐘才能閱讀完成。

Kafka 的基本概念該如何理解,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

介紹

Kafka 是一個分布式的、可分區(qū)的、可復制的消息系統(tǒng)。它提供了普通消息系統(tǒng)的功能,但具有自己獨特的設計。

這個獨特的設計是什么樣的呢?

首先讓我們看幾個基本的消息系統(tǒng)術語:
Kafka 將消息以 topic 為單位進行歸納。
將向 Kafka topic 發(fā)布消息的程序成為 producers.
將預訂 topics 并消費消息的程序成為 consumer.
Kafka 以集群的方式運行,可以由一個或多個服務組成,每個服務叫做一個 broker.
producers 通過網絡將消息發(fā)送到 Kafka 集群,集群向消費者提供消息,如下圖所示:

 

客戶端和服務端通過 TCP 協(xié)議通信。Kafka 提供了 Java 客戶端,并且對多種語言都提供了支持。

Topics 和 Logs

先來看一下 Kafka 提供的一個抽象概念:topic.
一個 topic 是對一組消息的歸納。對每個 topic,Kafka 對它的日志進行了分區(qū),如下圖所示:
 

每個分區(qū)都由一系列有序的、不可變的消息組成,這些消息被連續(xù)的追加到分區(qū)中。分區(qū)中的每個消息都有一個連續(xù)的序列號叫做 offset, 用來在分區(qū)中唯一的標識這個消息。
在一個可配置的時間段內,Kafka 集群保留所有發(fā)布的消息,不管這些消息有沒有被消費。比如,如果消息的保存策略被設置為 2 天,那么在一個消息被發(fā)布的兩天時間內,它都是可以被消費的。之后它將被丟棄以釋放空間。Kafka 的性能是和數(shù)據(jù)量無關的常量級的,所以保留太多的數(shù)據(jù)并不是問題。

實際上每個 consumer 唯一需要維護的數(shù)據(jù)是消息在日志中的位置,也就是 offset. 這個 offset 有 consumer 來維護:一般情況下隨著 consumer 不斷的讀取消息,這 offset 的值不斷增加,但其實 consumer 可以以任意的順序讀取消息,比如它可以將 offset 設置成為一個舊的值來重讀之前的消息。

以上特點的結合,使 Kafka consumers 非常的輕量級:它們可以在不對集群和其他 consumer 造成影響的情況下讀取消息。你可以使用命令行來 tail 消息而不會對其他正在消費消息的 consumer 造成影響。

將日志分區(qū)可以達到以下目的:首先這使得每個日志的數(shù)量不會太大,可以在單個服務上保存。另外每個分區(qū)可以單獨發(fā)布和消費,為并發(fā)操作 topic 提供了一種可能。

分布式

每個分區(qū)在 Kafka 集群的若干服務中都有副本,這樣這些持有副本的服務可以共同處理數(shù)據(jù)和請求,副本數(shù)量是可以配置的。副本使 Kafka 具備了容錯能力。
每個分區(qū)都由一個服務器作為“l(fā)eader”,零或若干服務器作為“followers”,leader 負責處理消息的讀和寫,followers 則去復制 leader. 如果 leader down 了,followers 中的一臺則會自動成為 leader。集群中的每個服務都會同時扮演兩個角色:作為它所持有的一部分分區(qū)的 leader,同時作為其他分區(qū)的 followers,這樣集群就會據(jù)有較好的負載均衡。

Producers

Producer 將消息發(fā)布到它指定的 topic 中, 并負責決定發(fā)布到哪個分區(qū)。通常簡單的由負載均衡機制隨機選擇分區(qū),但也可以通過特定的分區(qū)函數(shù)選擇分區(qū)。使用的更多的是第二種。

Consumers

發(fā)布消息通常有兩種模式:隊列模式(queuing)和發(fā)布 - 訂閱模式 (publish-subscribe)。隊列模式中,consumers 可以同時從服務端讀取消息,每個消息只被其中一個 consumer 讀到;發(fā)布 - 訂閱模式中消息被廣播到所有的 consumer 中。Consumers 可以加入一個 consumer 組,共同競爭一個 topic,topic 中的消息將被分發(fā)到組中的一個成員中。同一組中的 consumer 可以在不同的程序中,也可以在不同的機器上。如果所有的 consumer 都在一個組中,這就成為了傳統(tǒng)的隊列模式,在各 consumer 中實現(xiàn)負載均衡。如果所有的 consumer 都不在不同的組中,這就成為了發(fā)布 - 訂閱模式,所有的消息都被分發(fā)到所有的 consumer 中。更常見的是,每個 topic 都有若干數(shù)量的 consumer 組,每個組都是一個邏輯上的“訂閱者”,為了容錯和更好的穩(wěn)定性,每個組由若干 consumer 組成。這其實就是一個發(fā)布 - 訂閱模式,只不過訂閱者是個組而不是單個 consumer。

 

由兩個機器組成的集群擁有 4 個分區(qū) (P0-P3) 2 個 consumer 組. A 組有兩個 consumerB 組有 4 個

相比傳統(tǒng)的消息系統(tǒng),Kafka 可以很好的保證有序性。
傳統(tǒng)的隊列在服務器上保存有序的消息,如果多個 consumers 同時從這個服務器消費消息,服務器就會以消息存儲的順序向 consumer 分發(fā)消息。雖然服務器按順序發(fā)布消息,但是消息是被異步的分發(fā)到各 consumer 上,所以當消息到達時可能已經失去了原來的順序,這意味著并發(fā)消費將導致順序錯亂。為了避免故障,這樣的消息系統(tǒng)通常使用“專用 consumer”的概念,其實就是只允許一個消費者消費消息,當然這就意味著失去了并發(fā)性。

在這方面 Kafka 做的更好,通過分區(qū)的概念,Kafka 可以在多個 consumer 組并發(fā)的情況下提供較好的有序性和負載均衡。將每個分區(qū)分只分發(fā)給一個 consumer 組,這樣一個分區(qū)就只被這個組的一個 consumer 消費,就可以順序的消費這個分區(qū)的消息。因為有多個分區(qū),依然可以在多個 consumer 組之間進行負載均衡。注意 consumer 組的數(shù)量不能多于分區(qū)的數(shù)量,也就是有多少分區(qū)就允許多少并發(fā)消費。

Kafka 只能保證一個分區(qū)之內消息的有序性,在不同的分區(qū)之間是不可以的,這已經可以滿足大部分應用的需求。如果需要 topic 中所有消息的有序性,那就只能讓這個 topic 只有一個分區(qū),當然也就只有一個 consumer 組消費它。

看完上述內容,你們掌握 Kafka 的基本概念該如何理解的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注丸趣 TV 行業(yè)資訊頻道,感謝各位的閱讀!

正文完
 
丸趣
版權聲明:本站原創(chuàng)文章,由 丸趣 2023-08-16發(fā)表,共計2505字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發(fā)布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 夏邑县| 柳江县| 南华县| 溧阳市| 华池县| 太康县| 敦煌市| 宁津县| 泸西县| 绩溪县| 奇台县| 禹州市| 新化县| 太湖县| 黔南| 翁源县| 贞丰县| 天水市| 鄢陵县| 大港区| 九江市| 隆化县| 酒泉市| 壶关县| 墨江| 慈溪市| 永城市| 黄骅市| 云阳县| 普洱| 潍坊市| 孝义市| 白河县| 平潭县| 巴塘县| 土默特右旗| 和林格尔县| 棋牌| 徐水县| 榆林市| 南靖县|