簡體   English   中英

Kafka 最佳實踐 - 在記錄反序列化之前應用重復數據刪除

[英]Kafka best practicies - apply the deduplication before record deserialization

用例
有一個上游系統通過 Kafka 生產數據批次(一個批次平均有 1000 萬條記錄)。
起始偏移量和預期記錄數通過一個主題(控制),數據本身通過另一個主題(數據)。
生產批次時,某些記錄可能會定期重復,從而使預期記錄與控制主題上發送的記錄不匹配。
每條記錄都有唯一的 ID。

問題
由於重復項未包含在預期記錄數中,我真的不知道何時停止處理數據。 另外,我想在反序列化之前跳過那些重復的記錄,以加快處理速度。

建議的解決方案
我建議在 Kafka header 中發送記錄 ID,這樣在消費者方面,我會將特定批次的 ID 保留在哈希集中,並檢查記錄是重復的還是新的。

壓縮日志不是一種選擇,因為消費者在生產者停止生產之前就開始消費記錄,所以無論如何都會出現重復項。

問題
我聽說每條記錄在 header 中發送 id 是反模式,但我想了解它是否真的是(以及為什么)。

先感謝您

將特定批次的 ID 保留在哈希集中

哈希集不是分布式的,如果消費者進程崩潰並需要重新啟動,則不會維護。

因此,您需要一個外部持久緩存,如 Redis、Hazelcast 等。


標頭可以具有您想要的任何值,但它們本身仍然需要反序列化。 它們當然不是反模式。

我有同事使用 Cassandra 或 MongoDB 與 Elasticsearch 的組合來防止重復 ID 的處理,這不僅可能發生在生產者身上,也可能發生在消費者重新平衡時缺少偏移量提交。 他們確實使用標頭來跟蹤該信息,但顯然,它增加了消費者的延遲,因此您需要增加max.poll.interval.ms或降低max.poll.records

據我了解,您有大量數據需要一起處理,這是一個經典的批處理 - 批處理實現。 為什么要為此使用 Kafka? 將數據拆分為多條消息會產生事件依賴性,這實際上是一種反模式,解決方案非常痛苦。 您是否考慮過使用其他模式,例如在存儲桶中的文件中創建數據並通過 kafka 消息發送存儲桶 URL。 這樣,您就可以擺脫重復的數據(但是在所有記錄都寫入存儲桶中之前您不能使用星號)。 很多時候,它仍然更快。

如果那沒有用,並且您仍然需要/更喜歡您的模式,那么您需要的是建立冪等性,這是一個很好的解釋: https://www.lydtechconsulting.com/blog-kafka-idempotent-consumer.html可以看到,需要更多的處理。

關於標題,是的,你可以,它確實是構建標准(你可以遵循Cloud Events標准),但我認為你不會贏得太多時間,通常消息不會重復。 如果您要構建過濾器並棄用大部分消息,那么此用例非常有用,但您的情況並非如此。

暫無
暫無

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

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