Kafka的三層消息架構


Kafka 屬於分佈式的消息引擎系統,它的主要功能是提供一套完備的消息發佈與訂閱解決方案。

Topic

本質上一個Topic是命名的記錄流。Kafka用log的方式記錄這些主題數據。一個主題Log會分成若干個分區(Partition),而這些分區可以分佈在不同的Kafka Server上或者不同的磁盤上。換句話說,我們可以認爲一個主題是一個分類目錄,是一個消息流名稱,或者是一個訂閱源。

Partition

Topic被分爲多個Partition,Producer產生的消息會被送到其中的某個分區。分區的編號從0開始。消息進入kafka後,會被送入某個主題的某個分區。具體進入哪個分區取決於:

  • Partition id:如果消息中指定了該值
  • key % num partitions:如果指定了key
  • Round robin :消息既沒有partition id 也沒有message key ,就會輪詢進入各個partition

每個分區中的消息按照順序排列,kafka通過消息偏移(offset)可以確定消息在分區中的位置。值得注意的是,發送的消息如果是在固定的分區,消息序列是有序的,而如果是不同的分區則無法保證順序。

消費者消費消息時,爲了提高消息者端的吞吐量,kafka引入了消費者組。多個用戶組成一個消費者組,共同消費一個主題各個分區的消息。並且一個分區只能由一個消費者去消費,但是一個消費者可以消費多個分區:

  • 當分區多於消費者時:
  • 當分區和消費者相等時:
  • 當分區小於消費者時:

如果某個消費者掛掉,其持有的分區會重新分配其他消費者,這就是Kafka的重平衡(Rebalance)。

分區的副本,kafka爲了保證數據的高可用,會在配置數量的broker上覆制分區的副本,這些副本中只有一個Leader,其他的稱爲FollowerLeader分區負責對外提供讀寫服務,其他Follower會同步數據,只做數據冗餘備份。這些副本Kafka用Zookeeper管理,一旦Leader掛掉,會重新再副本中選舉新的Leader. 這些只做數據同步備份的分區我們稱爲 ISR (in-sync replica)

只有當所有備份副本都將消息寫入自己的Log,這條消息的狀態纔會變爲“commited”,此時它纔可以被消費。

Record

Record(消息)是Producer和Consumer處理的對象和Kafka要處理的具體對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章