iT邦幫忙

0

Kafka 訊息訂閱發布系統簡介 - 完整架構介紹及總結

  • 分享至 

  • xImage
  •  

上次入門篇介紹了針對Kafka做了基本介紹,還沒看過的朋友可以先前往:
Kafka 訊息訂閱發布系統 簡介 - 入門篇
接下來文章將會圖解Kafka的詳細架構、總結優缺點,以及穿插一些小小的實作輔助理解,如果是對Kafka已經有基礎了解的朋友讓我們繼續看下去!


Kafka 架構 – Producer如何將資料寫入Topic

在 Kafka 中 Topic 被分成多個 Partition 分區。

  • Topic - 在 Kafka 中 topic 就像是 database 中的 table,為不同資料的類別名稱。
  • Partition - Topic 被分成多個 Partition ,Partition 是最小的存儲單元,掌握一個 Topic 的部分數據。每個 Partition 都是一個單獨的 log 文件,每條記錄都以追加的形式寫入。
  • Partition offset - 每個分區消息都有一個稱爲偏移量的唯一序列標識。

https://ithelp.ithome.com.tw/upload/images/20230408/20156067u58vFqeIdd.png
依據上圖可以看出每個Partition裡面是有順序的,因此如果我們希望一個Topic裡面的資料都是有序的,我們需要將Topic僅設定一個Partition,當一個Topic有多個Partition時,我們無法保證Topic資料被取出時,是按照存入的順序被取出。


Zookeeper

看到這邊不曉得有沒有人和我一樣會以為Topic的所有Partition會存在同一台機器上,其實Partition會存在不同機器上,也就是說上圖的Topic裡有3個Partition就會被分配到三台Server(Broker),而這三台Server(Broker)除了有自己的Partition資料外,還會存備份,而管理這些Broker的人就是Zookeeper。
https://ithelp.ithome.com.tw/upload/images/20230408/20156067gQeSMbwFaQ.png

  • Broker - 多個Broker組成Kafka Cluster,以保持負載平衡。Broker本身沒有狀態,而是由Zookeeper管理、紀錄每個Broker的狀態。一個Broker裡面可以有一或多個Partition,通常一個Broker就是一台Server。

  • ZooKeeper - ZooKeeper用於管理和協調Broker。 ZooKeeper服務主要用於紀錄Kafka系統中Broker(Server)的存活狀態,並且可以協調失敗的Broker如何存取資料。

這邊插播一個實例解說
https://ithelp.ithome.com.tw/upload/images/20230408/201560672glQNgK6NE.png
上圖示Kafka的server.properties,這邊我建立了三台機器,分別是三個Broker,在Zookeeper配置這些機器的位置,並且透過指令Create一個名為first的Topic。
https://ithelp.ithome.com.tw/upload/images/20230408/20156067IuGklcE8sA.png
透過上圖可以看到我告訴Zookeeper這個first的Topic需要有三個Partition,因此Producer存放資料的時候會被分流到這三個Partition中,達到存資料的負載均衡,並且進行備份,replication我設定為2,這邊需要注意,設定為2時,同個Server就只會有兩個Partition的資料(自己和另一個),像是上圖Broker1就存了partition0、partition1,由此可知,若想要每個Broker都備份到全部的資料,就需要將replication我設定為3。

相信透過這個實例大家對於Kafka架構就不會過於抽象,那我們就繼續用架構圖解釋備份機制


Kafka強大的備份機制

https://ithelp.ithome.com.tw/upload/images/20230408/20156067zATRa0ltTV.png
由上面的架構圖可以得知,在Broker中Leader是主要存取的Partition,Follower只是備份機制產生的,因此Follower不被讀取,只做備份使用,Kafka的備份機制可以讓某一台Server(Broker)斷線、停止服務的時候另外一台Server(Broker)可以正常地繼續運作,不會因為其他Broker停止導致資料流斷掉無法繼續存取資料,因為此時的Zookeeper會監測到Broker狀態,調渡資料存到其他正常運作的Broker。

這邊一樣利用實作模擬某台機器斷線,查看一下Zookeeper
https://ithelp.ithome.com.tw/upload/images/20230408/20156067aJXFnkz8XB.png
下指令Kill Broker3
Zookeeper發揮作用,Partition 2 的 Leader 3 => 2
Isr (InSyncReplication) 正在同步的複本:Leader3 已經不存活所以不能被同步


Consumer Group

特別說明,當多個Consumer組成一個Group訂閱某個Topic收取資料時,假設Topic中有10筆資料,某個Consumer Group裡有三個Consumer接收消息,那麼這三個Consumer可能會分別收到幾條訊息(3筆/3筆/4筆),整個Group總共收到10筆資料後,就不會再收資料,由此可知,當我今天的需求是希望Consumer可以收到Topic中完整的全部的訊息時,我的Consumer Group中只能有一位Consumer,這樣才可以保證消費者收到Topic的所有訊息喔!

若今天需要將Topic訊息全都讓所有有訂閱的Consumer收到就需要設定不同的GroupId(保持每個Group裡面只有一個Consumer即可)。


總結Kafka優點

  • 低耦合(把生產、存放、消費區分乾淨,降低彼此之間耦合性
  • 高擴展(耦合性低擴展性越強,當原本規劃的資源不足,可立即擴展,不影響原先架構
  • 一對多(推送訊息給所有訂閱者
  • 訊息系統內將訊息分類,訂閱者只取自己相關的訊息(TOPIC
  • 良好的備份機制 (其中一台機器斷線仍可繼續提供服務
  • 有序性 (在同一個Broker內可以確保順序性
  • 非同步傳輸 (有序性更為重要

剛開始學習Kafka架構時也覺得很多名詞很複雜,因此希望這文章搭配實作、白話的說明可以讓大家更進一步了解Kafka,更深入的操作我也還沒實作,若有甚麼好的文章或建議歡迎留言給我~ 互相交流!


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言