一文帶你搞懂 Kafka 的系統架構(深度好文,值得收藏)

来源:https://www.cnblogs.com/datadance/archive/2022/05/20/16292991.html
-Advertisement-
Play Games

Kafka 簡介 Kafka 是一種高吞吐、分散式、基於發佈和訂閱模型的消息系統,最初是由 LinkedIn 公司採用 Scala 和 java 開發的開源流處理軟體平臺,目前是 Apache 的開源項目。 Kafka 用於離線和線上消息的消費,將消息數據按順序保存在磁碟上,併在集群內以副本的形式存 ...


Kafka 簡介

Kafka 是一種高吞吐、分散式、基於發佈和訂閱模型的消息系統,最初是由 LinkedIn 公司採用 Scala 和 java 開發的開源流處理軟體平臺,目前是 Apache 的開源項目。

Kafka 用於離線和線上消息的消費,將消息數據按順序保存在磁碟上,併在集群內以副本的形式存儲以防止數據丟失。Kafka 可以依賴 ZooKeeper 進行集群管理,並且受到越來越多的分散式處理系統的青睞,比如 Storm、Spark、Flink 等都支持與 Kafka 集成,用於實時流式計算。

Kafka 開發者 Jay Kreps 提及關於 Kafka 名字的由來:
“ 因為 Kafka 系統的寫性能很強,所以找一個作家的名字來命名似乎是個好主意,大學期間我上了很多文學課,非常喜歡 Franz Kafka 這個作家,另外,這個名字聽上去也很酷~~ ”

消息隊列是乾什麼的?

學習 Kafka 不可避免地要認識下消息隊列,也就是我們常提到的 MQ(Message Queue),因為 Kafka 本質上也是一個消息隊列。

那麼消息隊列又是什麼呢?先來看一個比較官方的回答。

消息隊列是一種進程間通信或者同一個進程中不同線程間的通信方式,主要解決非同步處理、應用耦合、流量消峰等問題,實現高性能、高可用、可伸縮和最終一致性架構,是大型分散式系統不可缺少的中間件。

再說的直觀點,如下圖,系統 A 將消息發佈到 MQ,然後系統 B 再從 MQ 取消息。
在這裡插入圖片描述
那麼,為什麼系統 A 不直接發消息給系統 B ,中間還要隔一個 MQ 呢?這就要看下 MQ 的三個主要功能了。

1)非同步處理

消息隊列提供了非同步處理機制,因為很多時候用戶並不需要立即響應來處理消息,那麼通過這個機制就可以把所有消息放入 MQ 中。比如,某系統發來的數據中包含很多圖片信息,如果對其中的信息都進行保存處理,用戶一番操作下來可能會很久。採用非同步處理之後,系統會將所有數據存放在 MQ 中,用戶不需要立即處理,大大縮短了系統的響應時間。
在這裡插入圖片描述
2)應用解耦

消息隊列可以對系統間的依賴進行解耦,降低依賴系統變更帶來的影響。比如,用戶在下單後,訂單系統A需要通知系統B、系統C等做出響應的處理。傳統的做法,如下圖所示。
在這裡插入圖片描述
此時的系統A是強依賴系統B和系統C的,一旦系統B出現故障或者需要重新加入高耦合的系統D時,就必須要更改系統A的代碼。
在這裡插入圖片描述
如果經常出現這種依賴系統迭代的情況,那麼系統A就會很難維護,可以通過消息隊列對依賴系統進行解耦(如下圖),這樣系統A也無需關心其他系統的可用性。
在這裡插入圖片描述
3)流量削峰

流量削峰還有個形象的名字叫做削峰填谷,其實就是指當數據量激增時,能夠有效地隔離上下游業務,將上游突增的流量緩存起來,真正地填到谷中,以平滑的方式傳到下游系統,避免了流量的不規則衝擊。

比如,有個活動頁面平時也就 50qps,某一特殊時刻訪問量突然增多,能達到 1000qps,但是當前系統的處理能力最多為 100qps,這個時候可以通過消息隊列來進行削峰填谷,如下圖所示。
在這裡插入圖片描述
當然,Kafka 除了以上 MQ 這些功能之外,還提供了消息順序性保障、回溯消息、持久化存儲等功能,這個在後續文章中會詳細講解。

MQ 的兩種傳輸模式

消息在 MQ 中有兩種傳輸模型,分別是點對點(point to point)和發佈/訂閱(publish/subscribe)模型。

1)點對點模型

如圖所示,系統A發送的消息只能被系統B接收,其他的任何系統都不能獲取到系統A發送的消息。在日常生活中就像A撥通了B的電話,其他人是不可能接聽到的。
在這裡插入圖片描述

2)發佈/訂閱模型

與點對點模型的區別在於發佈/訂閱模型多了一個 topic 的概念,可以存在多個發佈者向相同主題發送消息,而訂閱者也可以存在多個,接收相同主題的消息。在日常生活中就像不同主題的報紙期刊,同時也有不同群體的讀者來訂閱。
在這裡插入圖片描述
那麼 Kafka 屬於哪種呢,事實上 Kafka 可以同時支持這兩種傳輸模型,這個後面會講。

Kafka 系統架構

終於到主角登場了,一個典型的Kafka 系統架構會包括 Producer、broker、Cosumer 等角色,以及一個 ZooKeeper 集群,先上個圖。
在這裡插入圖片描述

  • Producer:生產者,負責將客戶端生產的消息發送到 Kafka 中,可以支持消息的非同步發送和批量發送;
  • broker:服務代理節點,Kafka 集群中的一臺伺服器就是一個 broker,可以水平無限擴展,同一個 Topic 的消息可以分佈在多個 broker 中;
  • Consumer:消費者,通過連接到 Kafka 上來接收消息,用於相應的業務邏輯處理。
  • ZooKeeper:不廢話了~不認識它的可以翻下我前面發的文章,一文搞定 ZooKeeper;
  • Consumer Group:消費者組,指的是多個消費者共同組成一個組來消費一個 Topic 中的消息。

前面提到 Kafka 同時支持兩種消息傳輸模型,其中實現點對點模型的方式就是引入了 Consumer Group,目的主要是讓多個消費者同時消費,可以加速整個消費者端的吞吐量。

需要註意的是:一個 Topic 中的一個分區只能被同一個 Consumer Group 中的一個消費者消費,其他消費者不能進行消費。這裡的一個消費者,指的是運行消費者應用的進程,也可以是一個線程。

在整個 Kafka 集群中 Producer 將消息發送給 broker,然後 broker 再將接收到的消息存儲到磁碟中,然後 Consumer 再從 Broker 訂閱並消費消息。ZooKeeper 則是 Kafka 集群用來負責集群元數據的管理、控制器的選舉等操作的。

Kafka 中的重要概念

1)Topic 與 Partition

在 Kafka 中消息是以 Topic 為單位進行歸類的,Topic 在邏輯上可以被認為是一個 Queue,Producer 生產的每一條消息都必須指定一個 Topic,然後 Consumer 會根據訂閱的 Topic 到對應的 broker 上去拉取消息。

為了提升整個集群的吞吐量,Topic 在物理上還可以細分多個分區,一個分區在磁碟上對應一個文件夾。由於一個分區只屬於一個主題,很多時候也會被叫做主題分區(Topic-Partition)。

2)Leader 和 Follower

一個分區會有多個副本,副本之間是一主(Leader)多從(Follower)的關係,Leader 對外提供服務,這裡的對外指的是與客戶端程式進行交互,而 Follower 只是被動地同步 Leader 而已,不能與外界進行交互。

當然了,你可能知道在很多其他系統中 Follower 是可以對外提供服務的,比如 MySQL 的從庫是可以處理讀操作的,但是在 Kafka 中 Follower 只負責消息同步,不會對外提供服務。

一個有意思的事情是現在已經不提倡使用Master-Slave來指代這種主從關係了,畢竟Slave有奴隸的意思,在美國這種嚴禁種族歧視的國度,這種表述有點政治不正確了,所以目前大部分的系統都改成Leader-Follower了。

Kafka 多副本機制

Kafka 為分區引入了多副本機制,同一分區的不同副本中保存的信息是相同的,通過多副本機制實現了故障的自動轉移,當集群中某個 broker 失效時仍然能保證服務可用,可以提升容災能力。

如圖所示,Kafka 集群中有4個 broker,某個 Topic 有三個分區,假設副本因數也有設置為3,那麼每個分區就會有一個 Leader 和兩個 Follower 副本。

在這裡插入圖片描述
副本處於不同 broker 中,生產者與消費者只和 Leader 副本進行交互,而 Follower 副本只負責消息的同步。當 Leader 副本出現故障時,會從 Follower 副本中重新選舉新的 Leader 副本對外提供服務。

接下來我們來瞭解 Kafka 多副本機制中的一些重要術語。

  • AR(Assigned Replicas):一個分區中的所有副本統稱為 AR;
  • ISR(In-Sync Replicas):Leader 副本和所有保持一定程度同步的 Follower 副本(包括 Leader 本身)組成 ISR;
  • OSR(Out-of-Sync Raplicas):與 ISR 相反,沒有與 Leader 副本保持一定程度同步的所有Follower 副本組成OSR;

首先,生產者會將消息發送給 Leader 副本,然後 Follower 副本才能從 Leader 中拉取消息進行同步,在同一時刻,所有副本中的消息不完全相同,也就是說同步期間,Follower 相對於 Leader 而言會有一定程度上的滯後,當然這個滯後程度是可以通過參數來配置的。

那麼,我們就可以釐清了它們三者的關係:AR = ISR + OSR。

Leader 負責維護和跟蹤 ISR 集合中所有 Follower 副本的滯後狀態,當 Follower 出現滯後太多或者失效時,Leader 將會把它從 ISR 集合中剔除。

當然,如果 OSR 集合中有 Follower 同步範圍追上了 Leader,那麼 Leader 也會把它從 OSR 集合中轉移至 ISR 集合。

一般情況下,當 Leader 發送故障或失效時,只有 ISR 集合中的 Follower 才有資格被選舉為新的 Leader,而 OSR 集合中的 Follower 則沒有這個機會(不過可以修改參數配置來改變)。


 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 知識回顧 上一篇介紹了Spring中三級緩存的singletonObjects、earlySingletonObjects、singletonFactories,Spring在處理迴圈依賴時在實例化後屬性填充前將一個lambda表達式放在了三級緩存中,後續在獲取時進行了判斷,如果不需要進行對象代理, ...
  • 1. Netty源碼研究筆記(2)——Bootstrap系列 顧名思義,Bootstrap是netty提供給使用者的腳手架,類似於Spring的ApplicationContext,通過Bootstrap我們使用一些自定義選項,將相關的組件打包起來,從而快速的啟動伺服器、客戶端。 Bootstrap ...
  • ZooKeeper知識點總結 一、ZooKeeper 的工作機制 二、ZooKeeper 中的 ZAB 協議 三、數據模型與監聽器 四、ZooKeeper 的選舉機制和流程 本文將以如下內容為主線講解ZooKeeper中的學習重點,包括 ZooKeeper 中的角色、ZAB協議、數據模型、選舉機制、 ...
  • 現在驗證碼登錄已經成為很多應用的主流登錄方式,但是對於OAuth2授權來說,手機號驗證碼處理用戶認證就非常繁瑣,很多同學卻不知道怎麼接入。 認真研究胖哥Spring Security OAuth2專欄的都會知道一個事,OAuth2其實不管資源擁有者是如何認證的,只要資源擁有者在授權的環節中認證了就可 ...
  • 來源:csdn.net/xiaojin21cen/article/details/78587425 ZeroC ICE的Java版,Netty2作者的後續之作Apache MINA,Crmky的Cindy之外,還有個超簡單的QuickServer,讓你專心編寫自己的業務代碼,不用編寫一行TCP代碼。 ...
  • 1.創建線程池相關參數 線程池的創建要用ThreadPoolExecutor類的構造方法自定義創建,禁止用Executors的靜態方法創建線程池,防止記憶體溢出和創建過多線程消耗資源。 corePoolSize: 線程池核心線程數量,不會自動銷毀,除非設置了參數allowCoreThreadTimeO ...
  • 我們在上一篇博客中介紹了Linux系統Shell命令行下可執行程式應該遵守的傳參規範(包括了各種選項及其參數)。Python命令行程式做為其中一種,其傳參中也包括了位置參數(positional和可選參數(optional)。Python程式中我們解析在命令行中提供的各種選項(選項保存在sys.ar... ...
  • 1. Netty源碼研究筆記(1)——開篇 1.1. Netty介紹 Netty是一個老牌的高性能網路框架。在眾多開源框架中都有它的身影,比如:grpc、dubbo、seata等。 裡面有著非常多值得學的東西: I/O模型 記憶體管理 各種網路協議的實現:http、redis、websocket等等 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文將以 C# 語言來實現一個簡單的布隆過濾器,為簡化說明,設計得很簡單,僅供學習使用。 感謝@時總百忙之中的指導。 布隆過濾器簡介 布隆過濾器(Bloom filter)是一種特殊的 Hash Table,能夠以較小的存儲空間較快地判斷出數據是否存在。常用於允許一定誤判率的數據過濾及防止緩存 ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • 「簡單有價值的事情長期堅持做」 這是成功最簡單,但也最難學的秘訣。不經過訓練,人很難意識到時間複利的威力。 仙劍奇俠傳的「十里坡劍神」和金庸群俠傳的「十級野球拳」,就是簡單的事情持之以恆反覆做,最後就有巨大的威力 唐家三少成為網文收入第一,最重要的一步是十四年從未斷日更 這樣的案例很多,一開始可能成 ...
  • 迎面走來了你的面試官,身穿格子衫,挺著啤酒肚,髮際線嚴重後移的中年男子。 手拿泡著枸杞的保溫杯,胳膊夾著MacBook,MacBook上還貼著公司標語:“我愛加班”。 面試開始,直入正題。 面試官: 看你簡歷上面寫著精通MySQL,我先問你事務的特性是什麼? 老生常談,這個還有誰不會背的嗎? 我: ...
  • 基礎知識 python是一門腳本語言,它是解釋執行的。 python使用縮進做為語法,而且python2環境下同一個py文件中不能同時存在tab和空格縮進,否則會出錯,建議在IDE中顯示縮進符。 python在聲明變數時不寫數據類型,可以type(xx)來獲取欄位的類型,然後可以int(),list ...
  • 為什麼要多線程下載 俗話說要以終為始,那麼我們首先要明確多線程下載的目標是什麼,不外乎是為了更快的下載文件。那麼問題來了,多線程下載文件相比於單線程是不是更快? 對於這個問題可以看下圖。 橫坐標是線程數,縱坐標是使用對應線程數下載對應文件時花費的時間,藍橙綠代表下載文件的大小,每個線程下載對應文件2 ...
  • 詳細講解python爬蟲代碼,爬微博搜索結果的博文數據。 爬取欄位: 頁碼、微博id、微博bid、微博作者、發佈時間、微博內容、轉發數、評論數、點贊數。 爬蟲技術: 1、requests 發送請求 2、datetime 時間格式轉換 3、jsonpath 快速解析json數據 4、re 正則表達式提... ...
  • 背景: 一般我們可以用HashMap做本地緩存,但是HashMap功能比較弱,不支持Key過期,不支持數據範圍查找等。故在此實現了一個簡易的本地緩存,取名叫fastmap。 功能: 1.支持數據過期 2.支持等值查找 3.支持範圍查找 4.支持key排序 實現思路: 1.等值查找採用HashMap2 ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • 本章是系列文章的第八章,用著色演算法進行寄存器的分配過程。 本文中的所有內容來自學習DCC888的學習筆記或者自己理解的整理,如需轉載請註明出處。周榮華@燧原科技 寄存器分配 寄存器分配是為程式處理的值找到存儲位置的問題 這些值可以存放到寄存器,也可以存放在記憶體中 寄存器更快,但數量有限 記憶體很多,但 ...