首页 > 解决方案 > 如何制作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 }"

标签: apache-kafka

解决方案


我是新来的,所以不能直接回复评论。

此评论是指将主题设置为压缩主题,以确保 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

但是,这里的主要警告是要了解压缩主题不会自动删除旧键。它们实际上会保留它们一段时间,即使我们将其配置为非常积极地删除旧消息,这实际上也是不可取的,因为它可能会产生多种副作用,例如缓慢的消费者,突然失去他们的指针(已删除),甚至性能问题。毕竟这是一个日志,删除临时条目既昂贵又耗时。


推荐阅读