首页 > 解决方案 > Kafka Log compaction也是去重机制吗

问题描述

Kafka Log compaction也是去重机制吗

我已经通过这篇文章Kafka 压缩进行重复数据删除

其中指出 Kafka Log 压缩不是重复数据删除机制。但我仍然很少怀疑。

q3)我无法理解日志压缩如何不能防止重复读取。

 Suppose Producer sends 2 records
 Key : Employee1 { Salary :1000 } 
Key : Employee1 { Salary :2000 } 

Consumer hasn't read the data yet.
Log Compaction happens
we have one only record
Key : Employee1 { Salary :2000 } 
Consumer reads data now

所以消费者只是在阅读 。因此Key : Employee1 { Salary :2000 }可以防止重复阅读。我哪里出错了?日志压缩仅在“提交段”时发生是什么意思?

标签: apache-kafka

解决方案


在您描述的情况下,即消费者尚未读取数据并且压缩发生 - 是的,在这种情况下可以防止重复读取。

但...

  • 如果压缩没有发生,您仍然会看到重复项。
  • 该配置delete.retention.ms (default value of 24 hours)允许消费者看到已删除的记录,这可能导致重复到达消费者。这些消息将有一个删除标记。
  • 您的第二个问题- 压缩仅发生在已提交的段而不是活动段上。任何 Kafka 分区中的消息都按段排列在磁盘上。一旦分段的大小达到 1 GB 或分段已存在 7 天(以较小者为准),分段就会关闭或提交。这些 1 GB 或 7 天的设置显然是可配置的。然后,打开一个新段并将新消息写入这个新段。现在,如果将重复项写入此活动段,并且如果消费者持续阅读(通常是这种情况),则将读取重复项。

因此,如果您考虑一下,您将无法仅依靠压缩功能来实现重复数据删除。此外,它不是可以使用 API 触发的东西(至少目前还不能),因此您也无法在您的消费者应用程序中控制它。

希望这可以帮助!


推荐阅读