卡夫卡生产者即使设置了acks = all也丢失了消息

时间:2020-08-19 08:55:27

标签: apache-kafka kafka-producer-api

这是我的配置:

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) {}
})

1 个答案:

答案 0 :(得分:1)

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

  • 一劳永逸
  • 同步
  • 异步

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

如前所述,您可以利用回调来了解经纪人的答复。这将是异步模式。但是请不要忘记也flush()缓冲记录。

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

producer.send(record).get();

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