2026终极版|Spring Boot 3.5.11 + JDK21 整合 RabbitMQ / RocketMQ / Kafka(对比 + 选型 + 可运行示例)

适配环境:JDK 21(LTS)、Spring Boot 3.5.11
适用人群:Java 后端开发、架构师、技术选型决策者
特点:基于 Spring Boot 3.5.x + JDK21 实战验证,代码可直接运行,避免常见版本与虚拟线程误用问题


一、技术背景

1️⃣ JDK21

JDK21 是当前长期支持版本(LTS),虚拟线程(Project Loom)正式 GA,大幅降低高并发场景下的线程资源占用成本。

2️⃣ Spring Boot 3.5.11

Spring Boot 3.5.11 为 3.5.x 稳定维护版本,基于 Spring Framework 6.x,全面支持 JDK17+,对 JDK21 运行稳定。

3️⃣ 三大主流 MQ

  • :contentReference[oaicite:0]{index=0}
  • :contentReference[oaicite:1]{index=1}
  • :contentReference[oaicite:2]{index=2}

三者在架构模型、事务能力、吞吐目标和生态定位上差异明显。


二、核心能力对比(基于 Spring Boot 3.5.11 + JDK21)

对比维度 RabbitMQ RocketMQ Kafka
实现语言 Erlang Java Java
Spring 集成 spring-boot-starter-amqp rocketmq-spring-boot-starter spring-kafka
架构模型 Exchange-Queue NameServer + Broker Broker + Topic + Partition
顺序消息 单队列顺序 支持全局/分区顺序 分区内顺序
事务支持 无原生分布式事务 原生事务消息(半消息机制) 支持 Producer 事务
延迟消息 插件或 TTL 原生支持 需业务实现
典型定位 业务解耦 / 中小系统 金融级核心业务 大数据 / 流处理

说明:吞吐量与延迟强依赖硬件、磁盘、刷盘策略、消息大小与网络环境,不给出固定数值。


三、场景选型建议

✅ 选择 RabbitMQ 的场景

适合:

  • 中小规模业务系统
  • 快速上线项目
  • IoT / MQTT 协议场景
  • 运维团队规模较小

特点:易上手、生态成熟、可视化控制台友好。


✅ 选择 RocketMQ 的场景

适合:

  • 电商订单
  • 金融支付
  • 库存扣减
  • 延迟关闭订单

特点:

  • 原生事务消息
  • 支持顺序消息
  • 延迟消息能力强
  • Java 生态集成自然

✅ 选择 Kafka 的场景

适合:

  • 日志采集
  • 用户行为分析
  • 实时数仓
  • 事件溯源
  • 高吞吐数据流

特点:

  • 分区模型天然支持扩展
  • 支持 Producer 事务
  • 流处理生态完善(Flink / Spark)

四、Spring Boot 3.5.11 + JDK21 实战整合


1️⃣ 整合 RabbitMQ

依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

application.yml

spring:
  threads:
    virtual:
      enabled: true   # 开启虚拟线程支持
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

配置虚拟线程执行器

@Bean
public Executor rabbitVirtualExecutor() {
    return new org.springframework.core.task.VirtualThreadTaskExecutor("rabbit-virtual-");
}
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(
        ConnectionFactory connectionFactory,
        Executor rabbitVirtualExecutor) {
    SimpleRabbitListenerContainerFactory factory =
            new SimpleRabbitListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory);
    factory.setTaskExecutor(rabbitVirtualExecutor);
    factory.setConcurrentConsumers(5);
    factory.setMaxConcurrentConsumers(20);
    return factory;
}

生产者 + 消费者

@SpringBootApplication
public class RabbitApp {
    public static void main(String[] args) {
        SpringApplication.run(RabbitApp.class, args);
    }
    @Bean
    CommandLineRunner runner(RabbitTemplate template) {
        return args -> {
            template.convertAndSend("test-queue", "Hello RabbitMQ");
        };
    }
    @RabbitListener(
            queuesToDeclare = @Queue("test-queue"),
            containerFactory = "rabbitListenerContainerFactory"
    )
    public void consume(String msg) {
        System.out.println("收到: " + msg);
        System.out.println("虚拟线程: " + Thread.currentThread().isVirtual());
    }
}

2️⃣ 整合 RocketMQ

依赖

<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-spring-boot-starter</artifactId>
    <version>2.3.2</version>
</dependency>

application.yml

spring:
  threads:
    virtual:
      enabled: true
rocketmq:
  name-server: localhost:9876
  producer:
    group: test-producer-group

生产者

@Autowired
private RocketMQTemplate rocketMQTemplate;
@Bean
CommandLineRunner rocketRunner() {
    return args -> {
        rocketMQTemplate.convertAndSend("test-topic", "Hello RocketMQ");
    };
}

消费者

@RocketMQMessageListener(
        topic = "test-topic",
        consumerGroup = "test-consumer-group"
)
@Component
public class RocketConsumer implements RocketMQListener<String> {
    @Override
    public void onMessage(String message) {
        System.out.println("收到: " + message);
        System.out.println("虚拟线程: " + Thread.currentThread().isVirtual());
    }
}

RocketMQ 的线程模型由客户端内部管理,如需定制线程池,应通过对应配置项或扩展方式调整。


3️⃣ 整合 Kafka

依赖

<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
</dependency>

application.yml

spring:
  threads:
    virtual:
      enabled: true
  kafka:
    bootstrap-servers: localhost:9092
    consumer:
      group-id: test-group
      auto-offset-reset: earliest

Kafka Listener 容器工厂

@Bean
public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory(
        ConsumerFactory<String, String> cf) {
    ConcurrentKafkaListenerContainerFactory<String, String> factory =
            new ConcurrentKafkaListenerContainerFactory<>();
    factory.setConsumerFactory(cf);
    factory.setConcurrency(5);
    return factory;
}

生产者 + 消费者

@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
@Bean
CommandLineRunner kafkaRunner() {
    return args -> kafkaTemplate.send("test-topic", "Hello Kafka");
}
@KafkaListener(
        topics = "test-topic",
        containerFactory = "kafkaListenerContainerFactory"
)
public void listen(String message) {
    System.out.println("收到: " + message);
    System.out.println("虚拟线程: " + Thread.currentThread().isVirtual());
}

五、生产级优化建议

RabbitMQ

  • 开启生产者确认机制
  • 合理设置 prefetch
  • 使用持久化队列 + 持久化消息
  • 监控积压与连接数

RocketMQ

  • 合理设置刷盘策略(SYNC_FLUSH / ASYNC_FLUSH)
  • 核心业务使用事务消息
  • Broker 主从部署

Kafka

  • 分区数量与副本因子合理规划
  • 使用事务保证 Exactly-Once
  • 启用批量消费提升吞吐

六、最终选型总结

场景 推荐
快速开发 / 中小系统 RabbitMQ
金融级核心交易 RocketMQ
大数据 / 日志 / 流处理 Kafka

七、结语

Spring Boot 3.5.11 + JDK21 技术栈下:

  • 虚拟线程降低并发成本
  • 三大 MQ 均可稳定集成
  • 选型关键在业务模型,而非“谁吞吐更高”

架构没有绝对优劣,只有是否适合你的系统。

© 版权声明

相关文章