【RabbitMQ的监听器容器Simple和Direct】 实现和场景区别
在Spring Boot中,RabbitMQ的两种监听器容器(SimpleMessageListenerContainer和DirectMessageListenerContainer)在实现机制和使用场景上有显著差异。以下是它们的核心区别、配置方式及最佳实践:

Simple类型

Direct类型

一、核心区别
| 特性 | SimpleMessageListenerContainer | DirectMessageListenerContainer |
|---|---|---|
| 线程模型 | 单线程管理所有消费者(线程池复用) | 每个消费者独立线程(更轻量级) |
| 并发控制 | 动态调整消费者线程池concurrentConsumers | 固定每个队列的消费者数量(consumersPerQueue) |
| 消息预取(Prefetch) | 高预取可能导致消息堆积 | 低预取(默认1)更公平的消息分配 |
| 资源消耗 | 高(长连接、线程池) | 低(按需创建线程) |
| 适用场景 | 长耗时任务、需动态扩缩容消费者、负载均衡场景 | 高吞吐、低延迟、短任务 ;固定消费者数量、严格顺序处理场景 |
| 版本支持 | 旧版默认(Spring AMQP 1.x) | 新版默认(Spring Boot 2.0+) |
二、Spring Boot配置示例
1. 全局配置(application.yml)
spring:rabbitmq:listener:type: direct # 可选 simple 或 directsimple:concurrency: 5 # 初始消费者数max-concurrency: 10 # 最大动态扩展数prefetch: 50 # 每次预取消息数type: directdirect:consumersPerQueue: 1 # 保持默认,确保顺序性missingQueuesFatal: true # 生产环境建议开启,避免消息丢失acknowledge-mode: manual # 推荐手动确认模式(更可控)retry:enabled: truemax-attempts: 3 # 总尝试次数 = 初始消费 + 2次重试initial-interval: 2000ms # 首次重试间隔multiplier: 2 # 指数退避策略max-interval: 10000ms # 最大间隔保护stateless: false # 必须设为 false(确保事务性操作)重试过程示范
假设一个订单处理场景,消息内容为 {"orderId": 1001}:
首次消费尝试
消费者线程开始处理消息。
若业务逻辑抛出异常(如数据库连接失败),触发重试机制。
消息进入 retry 状态,等待 2秒。第二次重试
间隔时间 = initial-interval * multiplier = 2s * 2 = 4s。
若仍失败,继续等待 4秒。第三次重试
间隔时间 = 4s * 2 = 8s
(但不超过 max-interval 的 10s,即再有下一次,那么4s * 3 = 12s,超过了最大间隔10s,仍按最大间隔10s执行)。
最终失败后,根据配置执行以下操作之一:
手动确认模式:调用 basicNack(requeue=false),消息进入死信队列。
自动确认模式:抛出 AmqpRejectAndDontRequeueException 拒绝消息。监控与告警建议
监控指标:
重试次数 (rabbitmq_listener_retry_count)
死信队列堆积量 (rabbitmq_queue_messages_dlx)日志记录:
使用 MDC 记录消息 ID 和重试次数。
在最后一次重试失败时发送告警通知(如钉钉、Slack)。
2. 注解式监听器
@RabbitListener(queues = "myQueue", containerFactory = "simpleContainerFactory")
public void handleMessage(String payload) {// 业务逻辑
}
3. 自定义容器工厂
@Configuration
public class RabbitConfig {// Simple 容器工厂@Bean(name = "simpleContainerFactory")public SimpleRabbitListenerContainerFactory simpleFactory(ConnectionFactory connectionFactory) {SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();factory.setConnectionFactory(connectionFactory);factory.setConcurrentConsumers(5);factory.setMaxConcurrentConsumers(10);factory.setPrefetchCount(50);return factory;}// Direct 容器工厂@Bean(name = "directContainerFactory")public DirectRabbitListenerContainerFactory directFactory(ConnectionFactory connectionFactory) {DirectRabbitListenerContainerFactory factory = new DirectRabbitListenerContainerFactory();factory.setConnectionFactory(connectionFactory);factory.setConsumersPerQueue(2);factory.setPrefetchCount(1);return factory;}
}
三、使用场景与最佳实践
1. 选择 Simple 容器的场景
- 长耗时任务:如生成PDF报表、视频转码,需控制并发避免资源耗尽。
- 复杂错误处理:需自定义重试策略(如
RetryTemplate)和死信队列(DLQ)配置。 - 动态负载均衡:通过调整
concurrency和max-concurrency,自动扩展消费者线程应对流量高峰。 - 高吞吐场景:结合
prefetch批量拉取消息,减少网络开销(例如日志处理、批量任务)。
2. 选择 Direct 容器的场景
- 高吞吐低延迟:如订单创建、秒杀系统,要求快速响应。
- 资源敏感型应用:容器轻量,适合云环境或容器化部署(如K8s)。
- 公平消息分发:低预取(
prefetch=1)确保消息均匀分配给消费者。 - 固定资源分配:需严格控制每个队列的消费者数量(如支付回调等关键业务)。
- 顺序性要求:单个队列绑定固定消费者,保证消息顺序处理(如库存扣减)。
- 精细化重试控制:通过
retry配置实现自定义重试逻辑(如短信发送失败重试)。
3. 最佳实践
-
根据业务选择类型:
- 若需弹性伸缩,选择Simple监听器。
- 若需资源隔离或顺序保证,选择Direct监听器。
-
预取值(Prefetch)调优:
- 高吞吐场景:增大
prefetch减少网络交互(但可能增加内存压力)。 - 低延迟场景:减小
prefetch以快速响应新消息。
- 高吞吐场景:增大
-
消息确认与重试:
- 使用
manual确认模式,并在异常时调用channel.basicNack()触发重试或死信队列。
- 使用
-
错误处理:
- 始终配置
Dead Letter Exchange(DLX)和重试机制。
- 始终配置
-
监控与线程管理:
- 监控消费者线程状态,避免Simple模式下线程数过高导致资源耗尽。
- Direct模式下需评估队列数量与消费者配比,避免队列闲置。
- 通过RabbitMQ Management控制台监控队列堆积情况,调整
prefetch和并发数。
-
版本适配:
- Spring Boot 2.x+默认使用
Direct,如需切换回Simple需显式配置。
- Spring Boot 2.x+默认使用
四、常见问题
Q1: 消息堆积时如何选择容器?
- 若消息处理快,用
Direct并增加consumers-per-queue。 - 若处理慢,用
Simple并逐步提升max-concurrency,同时优化业务逻辑。
Q2: 如何避免消息重复消费?
- 确保业务逻辑幂等(如数据库唯一约束)。
- 启用手动确认模式(
acknowledge-mode: manual),在业务完成后手动ACK。
Q3: Direct容器为何有时效率低?
- 检查
prefetch是否过小(如默认1),适当增加以平衡吞吐和公平性。
listener的类型,其中simple和direct有不同的配置参数。比如,simple监听器可以设置并发消费者数量(concurrency和max-concurrency),而direct监听器则设置每个队列的消费者数量(consumers-per-queue)。这说明两者的并发处理方式不同,simple可能更适合动态调整消费者数量,而direct则固定每个队列的消费者数量。
单模式适合负载均衡,通过多个消费者处理同一队列的消息,而direct监听器可能更适合需要严格顺序或固定消费者的场景。
simple监听器提供更多的动态并发配置,适合需要横向扩展消费者的场景,而direct监听器则提供更固定的消费者数量配置,适合需要精确控制的场景。配置时需要注意各自的参数,如并发数、预取值、确认模式等。
通过合理选择容器类型和调优参数,可以显著提升RabbitMQ在Spring Boot中的性能和可靠性。建议结合压力测试和实际业务场景进行验证。
相关文章:
【RabbitMQ的监听器容器Simple和Direct】 实现和场景区别
在Spring Boot中,RabbitMQ的两种监听器容器(SimpleMessageListenerContainer和DirectMessageListenerContainer)在实现机制和使用场景上有显著差异。以下是它们的核心区别、配置方式及最佳实践: Simple类型 Direct类型 一、核心…...
NO.13十六届蓝桥杯备战|条件操作符|三目操作符|逻辑操作符|!||||(C++)
条件操作符 条件操作符介绍 条件操作符也叫三⽬操作符,需要接受三个操作数的,形式如下: exp1 ? exp2 : exp3条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算, exp2 计算的结果是整个表达式的结果&am…...
2025.1.8(qt图形化界面之消息框)
笔记(后期复习补充) 作业 1> 手动将登录项目实现,不要使用拖拽编程 并且,当点击登录按钮时,后台会判断账号和密码是否相等,如果相等给出登录成功的提示,并且关闭当前界面,发射一…...
旅游行业内容管理系统CMS提升网站建设效率与体验
内容概要 在如今快速发展的互联网时代,旅游行业对网站的要求越来越高,内容管理系统(CMS)的应用不可或缺。以 Baklib 为代表的先进CMS可显著提高旅游网站的建设效率与用户体验。为了满足不断变化的市场需求,这些系统通…...
使用 Scrapy 抓取网页数据
1. Scrapy 简介 Scrapy 是一个流行的 Python 爬虫框架,提供了强大的工具和灵活的扩展机制,用于高效抓取和处理网页数据。它支持异步 I/O,速度快且资源消耗低,非常适合大规模爬取任务。 2. 安装 Scrapy 确保你的 Python 环境版本…...
C# OpenCV机器视觉:SoftNMS非极大值抑制
嘿,你知道吗?阿强最近可忙啦!他正在处理一个超级棘手的问题呢,就好像在一个混乱的战场里,到处都是乱糟糟的候选框,这些候选框就像一群调皮的小精灵,有的重叠在一起,让阿强头疼不已。…...
kamailio关于via那点事
如果kamailio作为代理服务器,在转到目的路由时 不删除原始的via信息 会造成信息泄露 如果 Kamailio 作为代理服务器(SIP Proxy)在转发 SIP 请求时不删除原始的 Via 信息,这确实可能会造成信息泄露。 📌 为什么不删除 …...
[MFC] 使用控件
介绍如何使用控件,以及如何获取控件中的数值 check Box 添加点击事件,即选中和取消选中触发的事件 第一种方式是按照如下方式第二种方式是直接双击点击进去 void CMFCApplication1Dlg::OnBnClickedCheckSun() {// TODO: 在此添加控件通知处理程序代…...
【探索未来科技】2025年国际学术会议前瞻
【探索未来科技】2025年国际学术会议前瞻 【探索未来科技】2025年国际学术会议前瞻 文章目录 【探索未来科技】2025年国际学术会议前瞻前言1. 第四届电子信息工程、大数据与计算机技术国际学术会议( EIBDCT 2025)代码示例:机器学习中的线性回…...
使用wpa_supplicant和wpa_cli 扫描wifi热点及配网
一:简要说明 交叉编译wpa_supplicant工具后会有wpa_supplicant和wpa_cli两个程序生产,如果知道需要连接的wifi热点及密码的话不需要遍历及查询所有wifi热点的名字及信号强度等信息的话,使用wpa_supplicant即可,否则还需要使用wpa_…...
Sealos的k8s高可用集群搭建
Sealos 介绍](https://sealos.io/zh-Hans/docs/Intro) Sealos 是一个 Go 语言开发的简单干净且轻量的 Kubernetes 集群部署工具,能很好的支持在生产环境中部署高可用的 Kubernetes 集群。 Sealos 特性与优势 支持离线安装,工具与部署资源包分离&#…...
Android和DLT日志系统
1 Linux Android日志系统 1.1 内核logger机制 drivers/staging/android/logger.c static size_t logger_offset( struct logger_log *log, size_t n) { return n & (log->size - 1); } 写的off存在logger_log中(即内核内存buffer)&am…...
【openresty服务器】:源码编译openresty支持ssl,增加service系统服务,开机启动,自己本地签名证书,配置https访问
1,openresty 源码安装,带ssl模块 https://openresty.org/cn/download.html (1)PCRE库 PCRE库支持正则表达式。如果我们在配置文件nginx.conf中使用了正则表达式,那么在编译Nginx时就必须把PCRE库编译进Nginx…...
如何将网站提交百度收录完整SEO教程
百度收录是中文网站获取流量的重要渠道。本文以我的网站,www.mnxz.fun(当然现在没啥流量) 为例,详细讲解从提交收录到自动化维护的全流程。 一、百度收录提交方法 1. 验证网站所有权 1、登录百度搜索资源平台 2、选择「用户中心…...
【STM32】ADC|多通道ADC采集
本次实现的是ADC实现数字信号与模拟信号的转化,数字信号时不连续的,模拟信号是连续的。 1.ADC转化的原理 模拟-数字转换技术使用的是逐次逼近法,使用二分比较的方法来确定电压值 当单片机对应的参考电压为3.3v时,0~ 3.3v(模拟信…...
蓝桥杯算法日记|贪心、双指针
3412 545 2928 2128 贪心学习总结: 1、一般经常用到sort(a,an);【a[n]】排序,可以给整数排,也可以给字符串按照字典序排序 2、每次选最优 双指针 有序数组、字符串、二分查找、数字之和、反转字…...
ArcGIS Pro SDK (二十七)自定义许可
ArcGIS Pro SDK (二十七)自定义许可 环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0 文章目录 ArcGIS Pro SDK (二十七)自定义许可1 在Config.xaml中添加扩展配置2 在Module1.cs中实现接口IExtensionConfig1 在Config.xaml中添加扩展配置 <modules><inse…...
通过客户端Chatbox或OpenwebUI访问识别不到本地ollama中的模型等问题的解决
Chatbox和Open WebUI 等无法获取到 Ollama里的模型,主要是由以下原因导致: Ollama 服务未正确暴露给 Docker 容器或客户端模型未正确下载或名称不匹配网络配置或权限问题 排查以上问题的思路首先排查ollama服务是否启动,然后再看端口号 使…...
速度超越DeepSeek!Le Chat 1100tok/s闪电回答,ChatGPT 4o和DeepSeek R1被秒杀?
2023年,当全球科技界还在ChatGPT引发的AI狂潮中沉浮时,一场来自欧洲的"静默革命"正悄然改变游戏规则。法国人工智能公司Mistral AI推出的聊天机器人Le Chat以"比ChatGPT快10倍"的惊人宣言震动业界,其背后承载的不仅是技术…...
JVM速成=。=
JVM跨平台原理 跨平台:一次编译,到处运行 本质:不同操作系统上运行的JVM不一样,只需要把java程序编译成一份字节码文件,JVM执行不同的字节码文件。 Java是高级语言,提前编译一下(变成字节码文件…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
