【kafka】生产者的同步发送和异步发送

Kafka 的生产者端提供了同步发送和异步发送两种方式,适合不同的使用场景和性能需求。

以下是两种发送模式的详细讲解:

同步发送

概念

  • 同步发送是指生产者在发送一条消息后,会阻塞当前线程,等待 Kafka 返回发送结果(成功或失败)。

实现原理

  • 生产者通过调用 send() 方法发送消息,并使用 Future.get() 方法等待结果。
  • 在 Kafka 确认消息写入分区或抛出异常之前,线程会阻塞。

代码示例

java 复制代码
ProducerRecord<String, String> record = new ProducerRecord<>("topicName", "key", "value");
try {
    RecordMetadata metadata = producer.send(record).get();
    System.out.println("消息发送成功: " + metadata.toString());
} catch (Exception e) {
    e.printStackTrace();
}

优点

  1. 高可靠性:确保每条消息成功发送。
  2. 易调试:便于发现和处理异常。

缺点

  1. 性能较低:每次发送需等待服务器响应,吞吐量低。
  2. 线程阻塞:延迟高时影响应用性能。

适用场景

  • 对消息可靠性要求高的场景,如事务性操作、支付系统。

异步发送

概念

  • 异步发送是指生产者发送消息时不等待结果,而是立即返回,发送结果通过回调函数通知。

实现原理

  • 调用 send() 方法时提供回调函数(Callback)。
  • Kafka 在发送成功或失败时调用回调函数。

代码示例

java 复制代码
ProducerRecord<String, String> record = new ProducerRecord<>("topicName", "key", "value");
producer.send(record, (metadata, exception) -> {
    if (exception != null) {
        System.err.println("消息发送失败: " + exception.getMessage());
    } else {
        System.out.println("消息发送成功: " + metadata.toString());
    }
});

优点

  1. 性能高:非阻塞,快速发送大量消息。
  2. 灵活:通过回调函数异步处理结果。

缺点

  1. 可靠性较低:可能存在消息丢失。
  2. 调试复杂:需要通过回调函数处理异常。

适用场景

  • 高吞吐量场景,如实时日志、大数据流。

同步与异步对比

特性 同步发送 异步发送
性能
可靠性 较低
阻塞
实现复杂度 简单 较复杂
场景 消息可靠性要求高 吞吐量要求高

Kafka Producer 发送过程

  1. 序列化:将消息的 Key 和 Value 序列化。
  2. 分区选择:根据分区策略决定目标分区。
  3. 缓冲区写入:消息进入生产者缓冲区,等待批量发送。
  4. 网络传输:消息通过网络发送到 Kafka Broker。
  5. 消息确认:Kafka 返回确认,生产者处理结果(同步阻塞或异步回调)。

总结

  • 同步发送:适合高可靠性场景,确保消息不丢失,性能较低。
  • 异步发送:适合高吞吐量场景,性能高,但需注意处理异常。
  • 实际开发中可以结合使用:对关键消息同步发送,普通数据异步发送。
相关推荐
Query*10 小时前
分布式消息队列kafka【五】—— kafka海量日志收集实战
分布式·kafka
serendipity_hky12 小时前
【SpringCloud | 第5篇】Seata分布式事务
分布式·后端·spring·spring cloud·seata·openfeign
lang2015092815 小时前
Kafka元数据缓存机制深度解析
分布式·缓存·kafka
qq_3432470316 小时前
单机版认证kafka
数据库·分布式·kafka
pingzhuyan17 小时前
微服务: springboot整合kafka实现消息的简单收发(上)
spring boot·微服务·kafka
武子康17 小时前
Java-199 JMS Queue/Topic 集群下如何避免重复消费:ActiveMQ 虚拟主题与交付语义梳理
java·分布式·消息队列·rabbitmq·activemq·mq·java-activemq
源代码•宸17 小时前
分布式缓存-GO(简历写法、常见面试题)
服务器·开发语言·经验分享·分布式·后端·缓存·golang
A尘埃17 小时前
Java业务场景(高并发+高可用+分布式)
java·开发语言·分布式
苦学编程的谢18 小时前
RabbitMQ_7_高级特性(4)
分布式·rabbitmq
赵榕18 小时前
RabbitMQ发布订阅模式同一消费者多个实例如何防止重复消费?
分布式·微服务·rabbitmq