我一直在尝试使用kafka实现排队机制,我想确保在创建的主题中不插入重复的记录。
我发现在消费者中可以进行迭代。还有什么方法可以在生产者线程中做到这一点?
答案 0 :(得分:1)
这称为精确一次处理。
您可能会对Kafka FAQ的第一部分感兴趣,该部分描述了一些有关如何避免在数据生产(即生产方)上重复的方法:
语义一度只有两个部分:避免在数据期间重复 生产,并避免在数据消耗期间重复。
有两种方法可以在数据期间精确获取一次语义 生产:
- 每个分区以及每次访问网络时都使用一个写入器 错误检查该分区中的最后一条消息,以查看您的最后一条消息 写成功
- 在主目录中包含主键(UUID或其他内容) 消息并在消费者上进行重复数据删除。
如果您执行以下任一操作,则Kafka托管的日志将为 无重复。但是,没有重复的阅读取决于 也来自消费者的合作。如果消费者定期 检查它的位置,然后如果它失败并重新启动它将 从检查点位置重新启动。因此,如果数据输出和 检查点不是原子写的,将有可能得到 在这里也重复。此问题特定于您的存储 系统。例如,如果您使用的是数据库,则可以提交 这些一起进行交易。 HDFS加载程序Camus LinkedIn 对于Hadoop负载,Write做了类似的事情。另一种选择 不需要交易的是将偏移量与 使用主题/分区/偏移量加载和删除重复数据 组合。
我认为有两项改进可以使这变得容易得多:
- 生产商幂等可以自动完成,而且成本更低 通过有选择地在服务器上集成对此的支持。
- 现有 高水平的消费者不会暴露很多更细粒度的 控制偏移量(例如重置您的位置)。我们将努力 不久之后