我正在一个辅助项目中,将运输数据提取到kafka集群中。数据来自我市的公共API。例如:城市中的每条道路都有效。
我每隔几个小时就会上路。但是公共API没有返回timestamp
,因此我无法轻易分辨出哪些道路工程是新的或最近被修改的。大多数情况下,API返回的内容自上次以来就没有移动过。
我将道路工程ID用作主题关键字,并激活了日志压缩,因此重复很多并不会吓到我,因为我确定每项工作的最后状态都会保留下来。
但是考虑到重复的次数很多,而且我只对最新版本感兴趣,这可以吗?我是否应该尝试检测新的/修改后的道路工程并仅推送那些道路工程?有没有办法在Kafka中直接做到这一点?
答案 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
,这通常有助于显着减小字节大小。