一、技术背景
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 运行稳定。
基于 Spring Boot 3.5.11 与 JDK21 虚拟线程技术,对比分析 RabbitMQ、RocketMQ、Kafka 三大消息队列的核心能力与选型场景。内容涵盖架构模型、事务支持、延迟消息等维度,提供三种 MQ 的依赖配置、生产者消费者代码示例及生产级优化建议,旨在帮助开发者根据业务需求选择合适的中间件方案。
JDK21 是当前长期支持版本(LTS),虚拟线程(Project Loom)正式 GA,大幅降低高并发场景下的线程资源占用成本。
Spring Boot 3.5.11 为 3.5.x 稳定维护版本,基于 Spring Framework 6.x,全面支持 JDK17+,对 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 | 原生支持 | 需业务实现 |
| 典型定位 | 业务解耦 / 中小系统 | 金融级核心业务 | 大数据 / 流处理 |
说明:吞吐量与延迟强依赖硬件、磁盘、刷盘策略、消息大小与网络环境,不给出固定数值。
适合:
适合:
适合:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
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());
}
}
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.3.2</version>
</dependency>
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 的线程模型由客户端内部管理,如需定制线程池,应通过对应配置项或扩展方式调整。
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
spring:
threads:
virtual:
enabled: true
kafka:
bootstrap-servers: localhost:9092
consumer:
group-id: test-group
auto-offset-reset: earliest
@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 |
| 金融级核心交易 | RocketMQ |
| 大数据 / 日志 / 流处理 | Kafka |
在 Spring Boot 3.5.11 + JDK21 技术栈下:
架构没有绝对优劣,只有是否适合你的系统。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online