讲师中心 微信公众号
AI工具推荐 视频效率加速

Spring EmbeddedKafka 生产者等待消费者确认的实现方法

梦枫小哥_1337

梦枫小哥_1337

发布时间:2025-10-12 11:00:05

|

825人浏览过

|

来源于php中文网

原创

spring embeddedkafka 生产者等待消费者确认的实现方法

本文介绍了在使用 Spring EmbeddedKafka 进行集成测试时,如何实现生产者等待消费者确认消息已被处理的机制。由于 Kafka 的生产者和消费者是独立的,`acks` 参数仅保证 Broker 收到并持久化消息,并不能确保消费者成功消费。因此,我们需要自定义逻辑来实现生产者对消费者确认的等待。

在使用 Spring EmbeddedKafka 进行集成测试时,一个常见的需求是确保生产者发送的消息被消费者成功处理后再进行后续操作。然而,Kafka 的设计是生产者和消费者完全解耦的,生产者无法直接感知消费者是否已经消费了消息。即使配置了 acks=all,也只能保证消息被 Broker 成功接收并持久化,而不能保证消费者已经调用 Acknowledgement.acknowledge() 方法确认消费。

理解 Kafka 的 acks 参数

Kafka 的 acks 参数控制着生产者发送消息后,需要多少个 Broker 确认接收消息才算成功。它有以下几种取值:

  • acks=0: 生产者发送消息后,不会等待任何 Broker 的确认。这种模式下吞吐量最高,但可靠性最低,消息可能丢失。
  • acks=1: 生产者发送消息后,等待 Leader Broker 确认接收消息。这种模式下吞吐量和可靠性之间取得平衡。
  • acks=all 或 acks=-1: 生产者发送消息后,等待所有 ISR (In-Sync Replicas) Broker 确认接收消息。这种模式下可靠性最高,但吞吐量最低。

需要注意的是,acks 参数只与 Broker 的确认机制有关,与消费者是否消费消息无关。

实现生产者等待消费者确认的方案

由于 Kafka 本身不提供生产者等待消费者确认的机制,我们需要自定义逻辑来实现。以下是一些可能的方案:

  1. 使用共享状态: 可以通过共享内存、数据库、Redis 等方式,让消费者在消费消息后更新一个状态,生产者轮询检查该状态,直到状态变为已消费。

    • 优点: 实现简单。
    • 缺点: 需要引入额外的组件,轮询检查会消耗资源,可能存在延迟。
  2. 使用 Kafka Topic 作为确认通道: 消费者在成功消费消息后,向特定的 Kafka Topic 发送一条确认消息,生产者监听该 Topic,收到确认消息后认为消息已被消费。

    Theta EdgeCloud Skill
    Theta EdgeCloud Skill

    Theta EdgeCloud API密钥优先的运行时框架,具备安全的命令级授权与试运行安全保障。

    下载
    • 优点: 利用 Kafka 的消息机制,可靠性较高。
    • 缺点: 需要配置额外的 Topic,增加了复杂度。
  3. 使用回调函数: 生产者发送消息时,传递一个回调函数给消费者,消费者在成功消费消息后执行该回调函数。

    • 优点: 实现简单,不需要额外的组件。
    • 缺点: 回调函数的执行可能会阻塞消费者线程,需要谨慎处理。

示例代码 (使用 Kafka Topic 作为确认通道)

以下是一个使用 Kafka Topic 作为确认通道的示例代码:

生产者:

@Autowired
private KafkaTemplate<String, String> kafkaTemplate;

private final String confirmationTopic = "confirmation-topic";

public void sendMessageAndWaitForConfirmation(String topic, String message, String correlationId) throws ExecutionException, InterruptedException, TimeoutException {
    // 1. 发送消息到目标 Topic
    kafkaTemplate.send(topic, message);

    // 2. 监听确认 Topic,等待确认消息
    MessageListenerContainer container = createConfirmationListenerContainer(correlationId);
    container.start();

    // 3. 设置超时时间,防止无限等待
    try {
        latch.await(10, TimeUnit.SECONDS); // 假设超时时间为 10 秒
    } finally {
        container.stop(); // 停止监听器
    }

    if (latch.getCount() > 0) {
        throw new TimeoutException("Timeout waiting for confirmation message.");
    }
}

private MessageListenerContainer createConfirmationListenerContainer(String correlationId) {
    ContainerProperties containerProps = new ContainerProperties(confirmationTopic);
    CountDownLatch latch = new CountDownLatch(1);
    containerProps.setMessageListener((MessageListener<String, String>) record -> {
        if (record.value().equals(correlationId)) {
            latch.countDown();
        }
    });

    ConcurrentMessageListenerContainer<String, String> container = new ConcurrentMessageListenerContainer<>(consumerFactory, containerProps);
    return container;
}

消费者:

@KafkaListener(topics = "your-topic", groupId = "your-group")
public void listen(String message, Acknowledgment acknowledgment, @Header(KafkaHeaders.RECEIVED_MESSAGE_KEY) String key) {
    // 1. 处理消息
    processMessage(message);

    // 2. 发送确认消息到确认 Topic
    String correlationId = key; // 使用消息的 Key 作为 Correlation ID
    kafkaTemplate.send("confirmation-topic", correlationId);

    // 3. 手动提交 Offset
    acknowledgment.acknowledge();
}

注意事项:

  • 确保 confirmationTopic 存在,并且生产者和消费者都有权限访问。
  • 使用 correlationId 来关联消息和确认消息,避免错误匹配。
  • 设置合理的超时时间,防止生产者无限等待。
  • 确保消费者在发送确认消息后,成功提交 Offset。

总结

虽然 Kafka 本身不提供生产者等待消费者确认的机制,但我们可以通过自定义逻辑来实现。选择哪种方案取决于具体的需求和场景。使用 Kafka Topic 作为确认通道是一种可靠性较高的方案,但需要额外的配置和代码。在实际应用中,需要根据具体情况选择合适的方案。

相关文章

Kafka Eagle可视化工具
Kafka Eagle可视化工具

Kafka Eagle是一款结合了目前大数据Kafka监控工具的特点,重新研发的一块开源免费的Kafka集群优秀的监控工具。它可以非常方便的监控生产环境中的offset、lag变化、partition分布、owner等,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2891

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

517

2026.01.26

kafka消费者组有什么作用
kafka消费者组有什么作用

kafka消费者组的作用:1、负载均衡;2、容错性;3、广播模式;4、灵活性;5、自动故障转移和领导者选举;6、动态扩展性;7、顺序保证;8、数据压缩;9、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3206

2024.01.12

kafka消费组的作用是什么
kafka消费组的作用是什么

kafka消费组的作用:1、负载均衡;2、容错性;3、灵活性;4、高可用性;5、扩展性;6、顺序保证;7、数据压缩;8、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

690

2024.02.23

rabbitmq和kafka有什么区别
rabbitmq和kafka有什么区别

rabbitmq和kafka的区别:1、语言与平台;2、消息传递模型;3、可靠性;4、性能与吞吐量;5、集群与负载均衡;6、消费模型;7、用途与场景;8、社区与生态系统;9、监控与管理;10、其他特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

684

2024.02.23

Java 流式处理与 Apache Kafka 实战
Java 流式处理与 Apache Kafka 实战

本专题专注讲解 Java 在流式数据处理与消息队列系统中的应用,系统讲解 Apache Kafka 的基础概念、生产者与消费者模型、Kafka Streams 与 KSQL 流式处理框架、实时数据分析与监控,结合实际业务场景,帮助开发者构建 高吞吐量、低延迟的实时数据流管道,实现高效的数据流转与处理。

730

2026.02.04

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4718

2023.08.10

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4869

2023.11.02

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn