apache-kafka - 如何制作kafka主题的unqiue和去重版本
问题描述
如果我在 kafka 中有一个主题,其中包含使用整数作为键的消息。如何创建一个基于该主题但没有重复且消息按其键排序的主题?
例如,假设主题名为“my_topic”,该主题中有 5 条消息:
key: "10", value: "{ value: 15 }"
key: "13", value: "{ value: 40 }"
key: "11", value: "{ value: 30 }"
key: "10", value: "{ value: 15 }"
key: "12", value: "{ value: 20 }"
然后,如何创建一个“ordered_deduplicated_my_topic”,使其只有 4 条消息(因为其中的消息是按键按 asc 排序的,并且删除了重复的“10”):
key: "10", value: "{ value: 15 }"
key: "11", value: "{ value: 30 }"
key: "12", value: "{ value: 20 }"
key: "13", value: "{ value: 40 }"
解决方案
我是新来的,所以不能直接回复评论。
此评论是指将主题设置为压缩主题,以确保 Kafka 日志中每个键的唯一条目:这将是一个不正确的解决方案。压缩主题中的消息仍然存在一段时间,直到 Kafka 真正将它们标记为删除(墓碑),然后随着时间的推移实际删除它们。默认情况下,此时间是它不时清理的脏消息的比率。
您可以在此处查看和配置清洁率:https ://docs.confluent.io/current/installation/configuration/topic-configs.html#min.cleanable.dirty.ratio
实际上,您还可以配置消息在压缩日志中保留多长时间,类似于默认主题的工作方式,但确保始终保留最新出现的密钥: https ://docs.confluent.io/current/installation/configuration/ topic-configs.html#min.compaction.lag.ms
但是,这里的主要警告是要了解压缩主题不会自动删除旧键。它们实际上会保留它们一段时间,即使我们将其配置为非常积极地删除旧消息,这实际上也是不可取的,因为它可能会产生多种副作用,例如缓慢的消费者,突然失去他们的指针(已删除),甚至性能问题。毕竟这是一个日志,删除临时条目既昂贵又耗时。
推荐阅读
- php - 在我的主页上,我想显示一个“新闻”部分,其中包含过去 30 天内标记为“新闻”的帖子。如何?
- redis - 如何比 o(n) 更快地从 Redis 列表中删除
- reactjs - 出现错误 TS17004:除非提供了“--jsx”标志,否则无法使用 JSX
- angular - 在 Angular 库模块中导入 SCSS 变量文件
- python - 使用 matplotlib 和 seaborn 在多元时间序列图中突出显示时间间隔
- mongodb - 从 MongoDB FSGrids 开始
- python - 二叉搜索树中的“if self.left/right”是什么意思?
- python - 使用 Pandas,我如何用另一个系列的元素减去一个系列的所有重复元素?
- java - 仅使用 1 个 jbutton 单击时如何来回更改背景颜色,例如红色和绿色
- maven - 如何让 Quarkus 使用本地库类