有没有办法确保没有在kafka主题中插入重复记录?

问题描述 投票:1回答:1

我一直在尝试使用kafka实现排队机制,我希望确保不会在创建的主题中插入重复的记录。

我发现消费者可以进行迭代。有没有什么方法可以在生产者线程中做到这一点?

apache-kafka kafka-producer-api
1个回答
1
投票

这被称为精确一次处理。

您可能对Kafka FAQ的第一部分感兴趣,该部分描述了如何避免数据生成重复的一些方法(即在生产者方面):

恰好一旦语义有两个部分:避免数据生成期间的重复并避免数据消费期间的重复。

在数据生成期间,有两种方法可以获得完全一次的语义:

  1. 每个分区使用一个单一写程序,每次出现网络错误时,请检查该分区中的最后一条消息,看看上次写入是否成功
  2. 在消息中包含主键(UUID或其他内容),并在使用者上进行重复数据删除。

如果您执行其中一项操作,Kafka托管的日志将不会重复。然而,没有重复的阅读也取决于消费者的一些合作。如果消费者定期检查其位置,那么如果它失败并重新启动,它将从检查点位置重新开始。因此,如果数据输出和检查点不是原子写入的,那么也可以在这里获得重复数据。此问题特别适用于您的存储系统。例如,如果您使用的是数据库,则可以在事务中一起提交这些数据库。 LinkedIn编写的HDFS加载器Camus为Hadoop加载做了类似的事情。另一个不需要事务的替代方法是使用主题/分区/偏移量组合存储加载数据的偏移量和重复数据删除。

我认为有两个改进可以使这更容易:

  1. 通过可选地在服务器上集成对此的支持,可以自动且更便宜地完成生产者幂等性。
  2. 现有的高级消费者不会暴露许多更精细的抵消控制(例如重置你的位置)。我们将尽快完成这项工作
© www.soinside.com 2019 - 2024. All rights reserved.