这是我的配置:
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) {}
})
答案 0 :(得分:1)
Kafka Producer基本上具有三种向Kafka生成消息的模式:
仅致电producer.send(record)
时,您将应用即发即弃模式。配置acks
仅确保如果所有复制都已确认该消息,则该消息将被视为对Kafka的成功写入。但是,您的制作人不会等待答复。
如前所述,您可以利用回调来了解经纪人的答复。这将是异步模式。但是请不要忘记也flush()
缓冲记录。
另一种选择是应用 synchronous ,这可以通过等待代理程序的确认响应的阻塞方法get
来实现。您只需将唯一的代码行更改为
producer.send(record).get();
编辑:可能值得将重试次数增加到大于1
的数量。生产者Callback
可以返回可检索的异常,可以通过多次重试来解决。要了解所有回调异常,您可以在Producer Callback上查看另一个SO问题。