【问题标题】:How to make a unqiue and deduplicated version of a kafka topic如何制作一个独特且重复的kafka主题版本
【发布时间】:2019-08-04 09:40:04
【问题描述】:

如果我在 kafka 中有一个主题,其中包含使用整数作为键的消息。 如何创建基于该主题但不重复且消息按key排序的主题?

例如,假设主题名为“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条消息(因为其中的消息是按key排序的,并且重复的“10”被删除了):

key: "10", value: "{ value: 15 }"
key: "11", value: "{ value: 30 }"
key: "12", value: "{ value: 20 }"
key: "13", value: "{ value: 40 }"

【问题讨论】:

  • Kafka 中的消息根据偏移量按分区排序。您不能根据键或值在主题中对它们进行排序。您订购的用例是什么?如果您更准确地描述它,那么 Kafka Streams 的某些功能可能会有用。
  • 唯一的方法是 1) 使用 Kafka 流来过滤重复并订购和发布 2) 在消费者中手动执行并再次生成新主题。您可能想查看消费者端的 Kafka 流提供的内存压缩,它可以实现重复数据删除。但这里我们只讨论密钥重复数据删除。基于价值内容的去重只有通过一些应用逻辑才能实现

标签: apache-kafka


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    最新版本的 Kafka 带有完全一次性交付语义,旨在一次性写入 Kafka。如果您基于 kafka 的解决方案处于 beta 阶段,那么我建议您更新生产者和消费者以使用 exactly-once-semantics。如果您使用一次性语义,那么您根本不必担心它。

    如果您无法选择使用一次性语义,那么Effective strategy to avoid duplicate messages in apache kafka consumer 可能会有所帮助。

    【讨论】:

    • 他没有说他的重复记录是由于重复发布。如果它们确实是两个独立的事件,但恰好具有相同的键和值怎么办?
    【解决方案3】:

    为此,您应该将此主题的cleanup.policy设置为compact,如下所示:

    bin/kafka-topics.sh --zookeeper localhost:2181 --create --topic my-topic --partitions 1 --replication-factor 1 --config cleanup.policy=compact
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      相关资源
      最近更新 更多