簡體   English   中英

當應用程序中存在一個生產者和多個消費者時,apache kafka如何處理一致性

[英]How apache kafka handles consistency when one producer and multiple consumers exist in application

想象一下,你有一個擁有一個生產者( P1 )和許多消費者( C1-C2-C3 )的架構。 當一個小的java客戶端按順序生成M1,M2,M3的消息時,另一個java客戶端(3x縮放到另一台機器)獲取一條消息,然后在計算某些內容后將消息寫入數據庫表。

如果消費者應用程序中的計算周期不同並且最初消耗的消息可能以最后的順序寫入同一個表 ,那么可能會導致數據不一致。

也許我在文檔中遺漏了一些東西,但我想知道kafka如何在這種情況下處理一致性。

消費者不聽制作人。 代替:

  1. 生產者將消息寫入由Kafka服務器集群管理的Kafka主題,
  2. Kafka服務器將該消息保留在為該主題創建的其中一個分區中
  3. 只有這樣,消費者才能訪問該消息。

如果消費者屬於同一個消費者群體,那么他們中只有一個將從消息的分區中讀取,只有該消費者才能閱讀該消息。 如果消費者不在同一個消費者群體中,那么他們都可以閱讀該消息。 實際上,許多消費者可能會多次讀取該消息,直到Kafka服務器刪除該消息的時間超過了為該主題配置的生存時間。

一旦消費者從Kafka主題中讀取消息,Kafka就無法控制如何,何時或甚至是否處理該消息。

如果要保留發送到Kafka主題的相關消息的順序,可以選擇一個關於這些消息的唯一標識符作為Kafka 分區鍵

例如,如果您正在處理來自不同客戶的交易,您可以選擇customerId(假設它是客戶的唯一標識符)作為分區密鑰,以便您為給定客戶發送給Kafka的所有消息將最終出現在同一分區; 這意味着他們將按順序被同一消費者消費。

但是,如果您說所有消息都是相關的並且彼此依賴,那么除了在消費者方面自己處理並發性或者更好地只有一個分區和一個消費者之外,沒什么可做的。

如果您要寫入具有3個分區的主題T1 ,並且您的使用者位於使用者組中,則每個使用者將使用T1的一個分區。 假設C1分區1讀取, C2分區2讀取。不能保證跨多個分區的數據排序,只能在分區內保證排序。 請考慮以下示例:

P1按順序生成以下記錄:

╔════════╗
║ Record ║
╠════════╣
║ R1     ║
║ R2     ║
║ R3     ║
║ R4     ║
║ R5     ║
║ R6     ║
╚════════╝

假設記錄按以下方式分區:

╔═════════════╦═════════════╦═════════════╗
║ Partition 1 ║ Partition 2 ║ Partition 3 ║
╠═════════════╬═════════════╬═════════════╣
║ R1          ║ R2          ║ R3          ║
║ R4          ║ R5          ║ R6          ║
╚═════════════╩═════════════╩═════════════╝

現在C1可以在C2C3開始之前讀完所有的記錄。 因此記錄R4將在R2R3之前處理。 但是, 分區1中的排序將始終保留,因此R1將始終在R4之前接收和處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM