Kafka发送数据的三种模式
介绍 Kafka 生产者发送消息的常见方式,包括即发即忘、同步等待和异步回调,并比较可靠性、吞吐和适用场景。
Kafka 生产者发送数据时,常见理解方式可以分为三类:即发即忘、同步等待结果、异步回调处理。现代 Kafka Producer 底层通常以异步方式发送请求,但业务代码可以选择是否等待发送结果,以及如何处理成功或失败。
即发即忘
即发即忘是最简单的方式。应用调用 send() 后不关心返回结果,也不处理回调。它的代码最少,吞吐表现通常较好,但如果发生网络异常、序列化失败或 broker 拒绝写入,业务侧可能无法及时感知。
这种方式适合对少量丢失不敏感的日志、测试数据或临时事件。对于订单、支付、风控等关键数据,不建议采用完全不检查结果的方式。
同步等待
同步等待会在发送后调用返回对象的 get() 等待结果。成功时可以拿到 topic、分区和 offset,失败时可以捕获异常。
RecordMetadata metadata = producer.send(record).get();
System.out.println(metadata.offset());同步方式逻辑直观,便于确认单条消息是否写入成功,但会阻塞当前线程。高吞吐场景下,如果每条消息都同步等待,性能可能明显下降。它更适合低频关键操作、管理脚本或需要严格串行确认的场景。
异步回调
异步回调是在发送时传入 callback,客户端发送完成后回调成功或失败结果。它兼顾吞吐和错误处理,是业务系统中较常见的方式。
producer.send(record, (metadata, exception) -> {
if (exception != null) {
// 记录日志、告警或重试
return;
}
// 记录发送成功的分区和 offset
});使用异步回调时,要注意回调中不要执行耗时逻辑,否则会影响生产者客户端线程。失败处理也要谨慎,盲目无限重试可能造成消息乱序、重复或下游压力放大。
可靠性相关配置
发送模式之外,还要关注 acks、重试、幂等生产者、批量大小、压缩和超时等配置。比如 acks=all 通常比只等待 leader 确认更可靠,但延迟可能更高。启用幂等可以降低重试导致重复写入的风险,但具体效果仍取决于客户端版本和配置组合。
选择发送模式时,可以用一句话概括:不重要的数据追求简单和吞吐,关键数据要可确认、可重试、可观测。Kafka 生产者可靠性是代码模式和参数配置共同决定的。


