【问题标题】:Kafka producer losing message even if set acks=all即使设置 acks=all,Kafka 生产者也会丢失消息
【发布时间】:2020-08-20 16:25:35
【问题描述】:

这是我的配置:

props.put(ProducerConfig.ACKS_CONFIG, "all");
props.put(ProducerConfig.RETRIES_CONFIG, "1");
props.put(ProducerConfig.LINGER_MS_CONFIG, "1");

try {
    producer.send(record);
} catch (Throwable ex) {
    log.error(ex, "exception.");
}

但我们发现消息丢失。

如果网络抖动会导致这个?

我们需要使用回调发送吗?

producer.send(record, new Callback() {
  @Override
  public void onCompletion(RecordMetadata metadata, Exception exception) {}
})

【问题讨论】:

    标签: apache-kafka kafka-producer-api


    【解决方案1】:

    Kafka Producer 基本上有三种不同的模式来向 Kafka 生成消息:

    • 一劳永逸
    • 同步
    • 异步

    当只调用producer.send(record) 时,您正在应用即发即弃 模式。配置acks 仅确保如果所有复制都确认了该消息,则该消息将被视为对 Kafka 的成功写入。但是,您的制作人不会等待回复。

    正如您所提到的,您可以使用回调来了解代理的回复。这将是 异步 模式。但不要忘记也flush() 缓冲记录。

    另一种选择是应用 同步,这可以通过等待来自代理的确认响应的阻塞方法get 来实现。您只需将唯一的代码行更改为

    producer.send(record).get();
    

    编辑:将重试次数增加到大于1 可能是值得的。 Producer Callback 可以返回 retrieable 异常,这些异常可以通过多次重试来解决。要了解所有回调异常,您可以查看Producer Callback 上的另一个 SO 问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-19
      • 2021-08-26
      • 1970-01-01
      • 2017-02-28
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多