【问题标题】:Verify existence of message in a Kafka topic验证 Kafka 主题中是否存在消息
【发布时间】:2016-12-08 14:43:35
【问题描述】:

我希望避免向 Kafka 主题发送重复消息。

实现它的理想方法是什么?

使用 Apache Kafka 的 Java 客户端,在调用 KafkaProducer.send

之前是否有验证消息是否存在

我指的是这个doc

【问题讨论】:

    标签: java apache-kafka kafka-producer-api


    【解决方案1】:

    目前 (Kafka 0.10.1),没有办法使用 Kafka 进行一次性交付。无论您想要做什么解决方法,总会有一个差距,您最终可能会丢失消息或重复消息。

    但是,Kafka 将添加一个idempotent producer(计划用于0.10.2),这将允许您避免重复写入。 0.10.2 的目标发布日期是 beginning 2017

    【讨论】:

    • 将数据从 Kafka 主题导出到数据库并查询以验证其存在是否是个好主意?
    • 您也可以通过与消费者一起读取数据来验证它的存在。但这是超级昂贵和缓慢的。但是,目前还没有可以提供良好性能的好的解决方案。您将需要等待幂等生产者。要知道,接受重复写入并相应地设计下游消费者并在那里过滤掉重复项似乎是件好事。
    【解决方案2】:

    每次发送新邮件时都检查是否发送了相同的邮件是不切实际的。换一种方式想一想:您可以调用 KafkaProducer.send 方法,并通过回调通知您成功或失败。

    【讨论】:

    • 这种方法不保存。即使在成功的情况下,如果生产者中的失败发生在成功写入之后,但在触发回调之前,则可能不会回调生产者。需要对此投反对票。将添加一个新答案。
    【解决方案3】:

    这几乎超出了 Kafka 的范围。您需要使用为随机访问提供适当索引的不同存储来执行此操作。 根据您的需要,可以是(分布式)缓存、键值存储或其他任何东西。

    您可能希望在消费者端而不是生产者端执行此操作,因为不同的消费者可能使用不同的重复数据删除策略(有些消费者可能只是容忍重复)。

    【讨论】:

    • 问题是关于写入 Kafka 而不是写入外部系统。
    猜你喜欢
    • 2017-10-02
    • 2017-06-12
    • 2017-06-07
    • 2015-08-19
    • 2023-03-16
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多