设计:将重复的状态发送到Kafka主题中

时间:2020-05-28 14:14:23

标签: apache-kafka kafka-producer-api

我正在一个辅助项目中,将运输数据提取到kafka集群中。数据来自我市的公共API。例如:城市中的每条道路都有效。

我每隔几个小时就会上路。但是公共API没有返回timestamp,因此我无法轻易分辨出哪些道路工程是新的或最近被修改的。大多数情况下,API返回的内容自上次以来就没有移动过。 我将道路工程ID用作主题关键字,并激活了日志压缩,因此重复很多并不会吓到我,因为我确定每项工​​作的最后状态都会保留下来。

但是考虑到重复的次数很多,而且我只对最新版本感兴趣,这可以吗?我是否应该尝试检测新的/修改后的道路工程并仅推送那些道路工程?有没有办法在Kafka中直接做到这一点?

1 个答案:

答案 0 :(得分:0)

Kafka的日志压缩非常适合您的用例。替代方案意味着自己编写代码,同时增加额外的复杂性。

正如您已经提到的,启用日志压缩时,重要的是要记住至少每个键(修路)的最后状态都保留在主题中。您仍然会发现重复项。

为了最大程度地减少重复,从而使总容量保持较低,您可以调整可用的topic configurations。最值得注意的是,我建议

  • 减少min.cleanable.dirty.ratio(默认值为0.5)以更频繁地进行清理。但是,请记住,这将导致清洁效率低下,同时使用更多资源。

  • 减少max.compaction.lag.ms(默认为MAX_LONG)以减少一条消息将不符合压缩条件的最长时间。

  • 如果您的应用程序有能力释放较旧的消息,请
  • 设置cleanup.policy=delete,compact。在这种模式下,两个清除策略都将被激活,并且您可以在给定的保留时间(甚至字节大小)内至少保持每个键的最新状态。

此外,如果您担心卷的大小,请在生产者中应用compression.type。从Kafka 2.2.0版开始,您可以使用zstd,这通常有助于显着减小字节大小。