KAFKA 消息生產過程


  • 寫入方式

    • producer 采用推(push)模式將消息發布到 broker,每條消息都被追加(append)到分區(patition)中,屬於順序寫磁盤(順序寫磁盤效率比隨機寫內存要高,保障 kafka 吞吐率)

  • 分區(Partition)

    • 消息發送時都被發送到一個 topic,其本質就是一個目錄,而 topic 是由一些 PartitionLogs(分區日志)組成,每個 Partition 中的消息都是有序的,生產的消息被不斷追加到Partition log 上,其中的每一個消息都被賦予了一個唯一的 offset 值,其組織結構如下圖所示:

      •  

    • 分區的原因

      • 實現水平擴展。每個 Partition 可以通過調整以適應它所在的機器,而一個topic 又可以由多個 Partition 組成,因此整個集群就可以適應任意大小的數據

      • 實現負載均衡。以 Partition 為單位讀寫,提高並發量

    • 分區的原則

      • 指定了 patition,則直接使用

      • 未指定 patition 但指定 key,通過對 key 的 value 進行 hash 出一個 patition

      • patition 和 key 都未指定,使用輪詢選出一個 patition

  • 副本(Replication)

    • 同一個 partition 可 能 會 有 多 個 replication 。沒有 replication 的情況下,一旦 broker 宕機,其上所有patition的數據都不可被消費,同時 producer 也不能再將數據存於其上的 patition。引入 replication 之后,同一個 partition 可能會有多個 replication,而這時需要在這些 replication 之間選出一個leader,producer 和 consumer 只與這個 leader 交互,其它 replication 作為 follower 從 leader中復制數據

  • 寫入流程

     

     

    • producer 先從 zookeeper 的 "/brokers/.../state"節點找到該 partition 的 leader

    • producer 將消息發送給該 leader

    • leader 將消息寫入本地 log

    • followers 從 leader pull 消息,寫入本地 log 后向 leader 發送 ACK

    • leader 收到所有 ISR 中的 replication 的 ACK 后,增加 HW(high watermark,最后 commit的 offset)並向 producer 發送 ACK


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM