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 生产者可靠性是代码模式和参数配置共同决定的。

开启Data+AI 之旅

填写表单,获取专属解决方案

400-002-1024

工作日 9:00-18:00

关注公众号

获取最新产品动态与技术干货

关注公众号

企业微信

扫码添加企业微信