讀書筆記——Kafka核心技術與實戰(Kafka入門)

  • 一.消息引擎系統ABC

    • 一款消息引擎系統,傳說中的消息中間件/MQ
    • 傳輸的對象是消息;如何進行消息的傳輸是消息引擎設計機制的一部分
    • 傳輸協議:
      • 點對點;
      • 發佈訂閱;
    • 消息從A到B之間之所以需要一個消息引擎——“削峯填谷”
    • 秒殺系統:將瞬間增加的訂單流量以消息形式保存在對應的主題中,一不影響上游的TPS,二給予下游較多的時間消費消息;
  • 二. 一篇文章讓你快速掌握Kafka術語

    • Kafka屬於分佈式消息引擎系統,用以提供一套完備的消息發佈和訂閱解決方案。
    • 主要術語:
      • 消息:Record,Kafka處理的主要對象;
      • 主題:Topic,承載消息的邏輯容器,用以區分具體業務;
      • 分區:Partition,有序不變的消息序列,一個主題下多個分區;
      • 消息位移:Offset,分區中每條消息的位置信息,單調遞增;
      • 副本:Replica,同一消息有同一個分區的多個地方的數據冗餘副本實現高可用,分爲領導者副本和追隨者副本;
      • 生產者:Producer,向主題發佈新消息的應用程序;
      • 消費者:Consumer,從主題訂閱新消息的應用程序;
      • 消費者位移:Consumer Offset,消費者消費進度,每個消費者都有自己的位移;
      • 消費者組:Consumer Group,多個消費者實例組成的一個組,用以消費多個分區來實現高吞吐;
      • 重平衡:Rebalance,消費組內某個消費者實例掛掉後,其他消費者實例自動重新分配訂閱主題分區的過程,是實現高可用的重要手段;
    • 一些疑難點:
      • 什麼是Kafka中的客戶端和服務器端?
        • 客戶端:向主題發佈消息的客戶端應用程序以及訂閱主題消息的應用程序
        • 服務器端:一個Kafka集羣由多個Broker的服務進程組成,Broker負責接收並處理客戶端的請求並對消息進行持久化操作;
      • 爲什麼不同的Broker分散在不同機器上?
        • 若一臺集羣中的機器宕機,則在此之上的所有Broker進程都掛掉,其他機器的其他Broker進程也能提供服務,這是Kafka實現高可用的手段之一。
      • 既然你提到高可用,那實現高可用還有哪些手段?
        • 備份機制 Replication,把相同的數據拷貝到多臺機器上,這些相同的數據拷貝稱爲副本,分爲領導者副本——對外提供服務,與客戶端交互;和追隨者副本——被動地追隨領導者副本;
      • 副本的工作機制是怎樣的呢?
        • 生產者只向領導者副本寫消息,消費者只向領導者副本讀消息。追隨者副本只向領導者副本發送請求,將最新的生產消息發送給它,使自己能保持同步;這樣可以保證消息持久化和不丟失;
      • 那Kafka有沒有考慮系統伸縮性的問題呢?
        • 有考慮,伸縮性即Scalability,是分佈式系統中必須要考慮的問題,我們設想這樣一個場景,領導者副本積累了太多的數據導致單臺Broker機器無法容納了。Kafka的做法是把數據切割成好幾份存放在不同的Broker上。這就是所謂的分區Partition。
      • 什麼是分區?
        • 你可能聽過分片,分區域,譬如MongoDB和ES的Sharding,Hbase的Region。Kafka將一個主題分成多個分區,每一個分區都是一組有序的消息日誌。消息只會被髮送到一個分區中,Kafka的分區從0開始。
      • 那麼分區和副本之間是什麼關係呢?
        • 副本在分區這個層次定義,一個分區多個副本,但只能有一個領導者副本。每條消息在分區中的位置由位移來表徵。
      • Kafka的三層消息架構是什麼?
        • 第一層是主題層,一個主題M個分區,一個分區N個副本;
        • 第二層是分區層,一個分區的N個副本中只有一個是領導副本,其他追隨副本僅用以數據冗餘;
        • 第三層是消息層,消息的位移從零開始;
      • 前面提到的Broker的消息持久化,請問是怎麼實現的?
        • Kafka使用消息日誌保存日誌,一個日誌就是磁盤上只能追加寫(Append-Only)的日誌文件。只能追加寫,避免了緩慢的隨機IO操作,改成了性能較好的順序IO操作。但最終可能會耗盡磁盤空間,Kafka必定會定期清除消息。
      • 解釋下Kafka是怎麼定期清除消息的?
        • 通過日誌段(Log Segment)機制,Kafka底層一個日誌會分成多個Segment日誌段,消息被追加到當前的日誌段,當一個日誌段寫滿時會開闢出新的日誌段,久的日誌段被封存,定期定時任務刪除。
      • 講一講P2P和發佈訂閱在Kafka中的應用?
        • 點對點指的是同一個消息只能被下游的一個消息者消費,Kafka爲實現點對點模型而引入了消費組的概念,這組主題的分一個分區只能被消費組的一個實例消費,其他實例不可染指。主要是提高消費者段的吞吐量TPS,多個實例一起消費。消費者實例是運行消費者應用的進程或線程。
      • 在一個消費者組下,一個分區只能被一個消費者消費,但一個消費者可能被分配多個分區,因而在提交位移時也就能提交多個分區的位移。
      • 如果有消費者無法分配到分區,則處於idle遊離狀態。
      • 要是組內的一個消費者實例掛掉了怎麼辦?
        • Kafka會自動檢測,將之前負責的分區轉移給其他的消費者。Rebalance。
      • 消息在分區中的位移是分區位移,在消費者端的位移是消費者位移。
      • 爲什麼Kafka不像Mysql那樣允許副本對外的客戶端應用提供讀服務?
        • Kafka的讀可以從多個Broker讀而實現負載均衡,不像Mysql那樣的主從,壓力都在主上;
        • Kafka的數據持久化和Mysql數據持久化有着本質的區別,Kafka的數據劇透消費的概念,是流數據,需要位移控制,而增加副本的讀會增加位移控制的難度;
  • 我有一個問題,Kafka的消費進度是由消費者客戶端控制的Offset還是Broke副本控制的Offset,其他的MQ呢?

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