【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 返回确认,生产者处理结果(同步阻塞或异步回调)。

总结

  • 同步发送:适合高可靠性场景,确保消息不丢失,性能较低。
  • 异步发送:适合高吞吐量场景,性能高,但需注意处理异常。
  • 实际开发中可以结合使用:对关键消息同步发送,普通数据异步发送。
相关推荐
初次攀爬者9 小时前
Kafka + KRaft模式架构基础介绍
后端·kafka
初次攀爬者9 小时前
Kafka + ZooKeeper架构基础介绍
后端·zookeeper·kafka
初次攀爬者10 小时前
Kafka 基础介绍
spring boot·kafka·消息队列
DemonAvenger4 天前
Kafka性能调优:从参数配置到硬件选择的全方位指南
性能优化·kafka·消息队列
初次攀爬者4 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
yumgpkpm6 天前
AI视频生成:Wan 2.2(阿里通义万相)在华为昇腾下的部署?
人工智能·hadoop·elasticsearch·zookeeper·flink·kafka·cloudera
予枫的编程笔记6 天前
【Kafka高级篇】避开Kafka原生重试坑,Java业务端自建DLQ体系,让消息不丢失、不积压
java·kafka·死信队列·消息中间件·消息重试·dlq·java业务开发
倚肆6 天前
在 Windows Docker 中安装 Kafka 并映射 Windows 端口
docker·kafka
断手当码农6 天前
Redis 实现分布式锁的三种方式
数据库·redis·分布式