设计:将重复状态发送到 Kafka 主题
Design: send duplicate states into Kafka topic
我正在做一个副项目,我将交通数据提取到 kafka 集群中。数据来自我市publicAPI。例如:市内各路工程。
我每隔几个小时就去修路。但是 public API 没有返回 timestamp
,所以我无法轻易判断哪些道路工程是新的或最近修改过的。大多数时候 API 返回的内容自上次以来没有移动过。
我使用 roadwork id 作为主题键并激活了日志压缩,所以有很多重复项不会吓到我,因为我确信每项工作的最后状态都会被保留。
但是考虑到大量的重复以及我只对最后一个版本感兴趣的事实,这样可以吗?我是否应该尝试检测 new/modified 道路工程并仅推动这些道路工程?有没有办法直接在 Kafka 中执行此操作?
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
可用,这通常有助于显着减少字节大小。
我正在做一个副项目,我将交通数据提取到 kafka 集群中。数据来自我市publicAPI。例如:市内各路工程。
我每隔几个小时就去修路。但是 public API 没有返回 timestamp
,所以我无法轻易判断哪些道路工程是新的或最近修改过的。大多数时候 API 返回的内容自上次以来没有移动过。
我使用 roadwork id 作为主题键并激活了日志压缩,所以有很多重复项不会吓到我,因为我确信每项工作的最后状态都会被保留。
但是考虑到大量的重复以及我只对最后一个版本感兴趣的事实,这样可以吗?我是否应该尝试检测 new/modified 道路工程并仅推动这些道路工程?有没有办法直接在 Kafka 中执行此操作?
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
可用,这通常有助于显着减少字节大小。