RabbitMQ: 声明式配置简化管理

RabbitMQ消息队列安装配置及常用交换机 参数一队列名称,参数二 队列持久化 重启mq队列仍然存在,参数三exclusive – 如果我们声明一个独占队列,则为 true(该队列将仅由声明者的连接使用),参数四 当所有消费客户端连接断开后,是否自动删除 队列 true:删除 false:不删除 官方解释:autoDelete – 如果服务器在队列不再使用时应删除队列,则为 true。将镜像加载到容器中运行。参数一队列名称或交换机名称,参数二为参数一值的类型 类型为队列或交换机,参数三交换机名称,参数四 路由键,参数五百度 设置为null。 阅读详情

概述


1 ) 核心痛点:当系统扩展需动态新增交换机/队列时,传统硬编码方式面临:

  1. 配置僵化:核心配置类不可修改(第三方库或权限限制)
  2. 资源浪费:新建 RabbitAdmin 实例导致冗余连接和内存占用
  3. 错误风险:手动 declare 操作易出现拼写/逻辑错误(如将队列声明为交换机)

2 ) 声明式配置的核心优势

  1. 配置与执行解耦
  • 声明即生效:仅需定义交换机/队列/绑定的 数据结构对象,由框架自动完成声明操作
  • 规避人为错误:消除手动调用 declareExchange()/declareQueue() 的编码风险
  1. 资源复用
  • 单例管理:复用全局 ConnectionFactory 和 RabbitAdmin,避免多实例造成的连接数暴涨
  • 懒加载机制:首次实际连接时触发声明,优化启动性能

3.无缝整合依赖注入

  • 配置对象自动注册至 IoC 容器,通过 依赖查找 实现跨模块复用

在 NestJS 中的实现步骤


1 ) 声明交换机/队列/绑定作为提供者

import { Module } from '@nestjs/common';
import { RabbitMQModule } from '@golevelup/nestjs-rabbitmq';
 
@Module({
  imports: [
    RabbitMQModule.forRoot(RabbitMQModule, {
      exchanges: [
        { name: 'order.direct', type: 'direct' }, // 声明交换机 
        { name: 'audit.topic', type: 'topic' }
      ],
      uri: 'amqp://localhost:5672',
    }),
  ],
  providers: [
    // 声明队列 
    { provide: 'ORDER_QUEUE', useValue: { name: 'order.queue', durable: true } },
    { provide: 'DELIVERY_QUEUE', useValue: { name: 'delivery.queue' } },
    
    // 声明绑定 
    { 
      provide: 'ORDER_BINDING', 
      useValue: { 
        exchange: 'order.direct', 
        target: 'order.queue', 
        keys: ['order.created'] 
      }
    }
  ],
  exports: [RabbitMQModule]
})
export class RabbitConfigModule {}

2 ) 配置连接工厂与 RabbitAdmin

import { Injectable, OnModuleInit } from '@nestjs/common';
import { RabbitMQService } from '@golevelup/nestjs-rabbitmq';
 
@Injectable()
export class RabbitAdminService implements OnModuleInit {
  constructor(private readonly rabbitService: RabbitMQService) {}
 
  onModuleInit() {
    // 激活连接触发声明(兼容遗留监听)
    this.rabbitService.managedConnection.connect(); 
  }
}

3 ) 注入使用声明对象

import { Inject, Injectable } from '@nestjs/common';
import { RabbitSubscribe } from '@golevelup/nestjs-rabbitmq';
 
@Injectable()
export class OrderService {
  constructor(
    @Inject('ORDER_QUEUE') private readonly orderQueueConfig,
  ) {}
 
  @RabbitSubscribe({
    exchange: 'order.direct',
    routingKey: 'order.created',
    queue: 'order.queue' // 自动匹配声明的队列 
  })
  handleOrderCreated(message: any) {
    console.log('Received order:', message);
  }
}

底层原理:懒加载与自动声明机制


  1. 声明对象注册流程
触发
定义Exchange/Queue/Binding
NestJS IoC容器
RabbitAdmin初始化
连接建立事件
遍历容器内配置对象
调用AMQP declare方法
  1. 关键触发点
  • 连接激活:首次调用 connectionFactory.createConnection() 时
  • 对象发现:通过 IoC 容器查找所有 Exchange/Queue/Binding 类型对象
  • 批量声明:按拓扑顺序执行 channel.declareExchange()/declareQueue()/bindQueue()
  1. 避免初始化竞争
  • 遗留监听器需延迟启动(或显式触发连接):
    @Injectable()
    export class LegacyListener {
      constructor(private readonly connectionFactory: ConnectionFactory) {}
    
      async start() {
        // 显式激活连接触发声明
        await this.connectionFactory.createConnection(); 
        // 启动传统监听 
        this.setupChannelListener(); 
      }
    }
    

工程示例:三种动态配置方案


1 ) 方案 1:环境感知配置
根据环境加载不同队列配置:

export const rabbitConfigFactory = {
  provide: 'RABBIT_CONFIG',
  useFactory: (configService: ConfigService) => ({
    exchanges: [
      { 
        name: configService.get('EXCHANGE_NAME'), 
        type: 'direct' 
      }
    ],
    queues: configService.get('ENV') === 'prod' ? 
      PROD_QUEUES : DEV_QUEUES // 动态队列配置 
  }),
  inject: [ConfigService]
};

2 ) 方案 2:动态绑定声明
运行时动态添加绑定关系:

@Injectable()
export class BindingService {
  constructor(private readonly rabbitService: RabbitMQService) {}
 
  addBinding(srcExchange: string, targetQueue: string, key: string) {
    // 动态添加绑定
    this.rabbitService.addBinding({
      exchange: srcExchange,
      target: targetQueue,
      keys: [key]
    });
  }
}

3 ) 方案 3:配置中心热更新
监听配置变化自动更新队列:

@Injectable()
export class ConfigHotReload {
  constructor(
    @Inject('AMQP_CONNECTION') private readonly connection,
    private readonly configService: ConfigService
  ) {
    configService.on('config-update', () => {
      this.redeclareQueues();
    });
  }
 
  private async redeclareQueues() {
    const channel = await this.connection.createChannel();
    await channel.assertQueue('dynamic.queue', {
      durable: true,
      // 从配置中心读取新参数 
      maxLength: this.configService.get('QUEUE_MAX_LEN') 
    });
  }
}

RabbitMQ 运维增强命令


常用管理 CLI(兼容 HTTP API):

# 查看已声明交换机 
rabbitmqadmin list exchanges name type 
 
# 动态添加新队列(不影响运行中服务)
rabbitmqadmin declare queue name=temp.queue durable=false 
 
# 绑定关系检查 
rabbitmqadmin list bindings source_name destination_name routing_key 

声明式配置 VS 传统方式

维度声明式配置传统手动声明
扩展性动态注入新配置需修改核心类
资源占用单例复用连接多实例冗余
可维护性配置集中管理逻辑分散在代码中
错误率框架自动校验声明完整性依赖开发人员手动调用

最佳实践建议

  1. 绑定关系解耦:将业务绑定的声明移入特性模块(如 OrderModule 声明订单相关绑定)
  2. 混合配置兼容:
    @Injectable()
    export class HybridConfig {
      // 声明式配置 
      @Inject('MAIN_EXCHANGE') exchange: Exchange;
      
      // 兼容遗留手动声明
      @PostConstruct()
      declareLegacyQueue() {
        channel.declareQueue({ name: 'legacy.queue' });
      }
    }
    
  3. 监控声明异常:监听 RabbitAdmin 的 declareFailed 事件捕获配置错误
  4. 拓扑验证工具:使用 rabbitmq-topology-validator 预检配置合法性

关键结论:声明式配置通过 框架托管资源生命周期 + IoC 容器聚合声明,解决动态扩展时的配置碎片化问题,同时降低编码错误率。在微服务持续演进场景下,该模式显著提升消息中间件的管理弹性。

RabbitMQ基本配置 可以理解为:一个Mysql又很多数据库,每一个数据库就相当于一个Virtual Hosts。本次整合需要创建2个springboot项目,一个为生产者,一个为消费者。2. 设置的rabbitMq的服务的主机 默认localhost。3. 设置的rabbitMq的服务的端口 默认5672。4. 设置的rabbitMq的服务的虚拟主机。生产者: --->按照JDBC思路。Fanout生产者的相关代码。Fanout消费者的相关代码。direct生产者模式。direct消费者模式。controller层。 阅读详情

相关推荐

1-12SpringAMQP 用户管理组件 RabbitAdmin 以及声明式配置

文章目录概念Spring整合RabbitAdmin1.1 引入依赖1.2 添加配置1.3测试1.4添加新的声明 概念 RabbitAdmin 类可以很好的操作 rabbitMQ,在 Spring 中直接进行注入即可。 Spring整合RabbitAdmin 1.1 引入依赖 <dependency> <groupId>com.rabbitmq</groupId...

Insist___的博客 721

RabbitMQ交换机

每个消息都有一个称为路由键(routing key)的属性,它其实就是一个简单的字符串。

qq_62898618的博客 3789

SAP SM30数据维护实战:条件筛选与动态校验的实现技巧

本文详细介绍了SAP SM30数据维护的实战技巧,重点讲解如何通过条件筛选实现精准数据查取,以及利用表维护生成器事件实现动态数据检查与校验。文章提供了从基础视图创建到高级事件编程的完整流程,包括调用函数VIEW_MAINTENANCE_CALL传递筛选条件,以及在NEW_DATA和CHANGE_SAVE事件中编写业务规则校验逻辑,帮助开发者提升SM30的管控能力与数据质量。

q9w8e7r6t5的博客 522

【RabbitMQ】RabbitMQ配置与交换机学习

RabbitMQ是一个开源的消息代理软件,它实现了高级消息队列协议(AMQP)。RabbitMQ支持多种消息传递协议,具有高可靠性、高可用性和高性能等特点。它允许应用程序通过消息队列进行异步通信,从而实现解耦和负载均衡。RabbitMQ的核心概念包括交换机(Exchange)、队列(Queue)和绑定(Binding),它们共同构成了消息的路由和传递机制。RabbitMQ的架构如图:publisher:生产者,也就是发送消息的一方consumer:消费者,也就是消费消息的一方queue。

weixin_73588491的博客 7633

金融行业软件测试面试题(含答案)

6、假如发现了一个BUG,跟开发本身没什么关系,涉及到理念,需求问题,如何解决?11、假如要你测试6个月期限的p2p借款产品,你应该怎么设计案例,说出测试点。17、如果京东有一个购物网页给你,你要怎么进行测试?31、我们公司自动化测试用的语言是Java,Java你不会,该怎么办?23、你们测试用的测试环境是谁给的?24、如果领导分配你的任务超出负荷,领导高估了你的能力,怎么办。26、给你一个模块测试,只有一个星期的时间你如何有效率地完成?29、如果你组长的用例写错了,但他认为是对的,你怎么处理?

crhnb的博客 918

YOLOv11改进 | 检测头篇 | 利用动态蛇形卷积DySnakeConv改进yolov11分割检测头(全网独家首发,Segment)

本文给大家带来的最新改进机制是一种我进行优化的专用于分割的检测头,在分割的过程中,最困难的无非就是边缘的检测,动态蛇形卷积(Dynamic Snake Convolution)通过自适应地聚焦于细长和迂回的局部结构,准确地捕捉管状结构的特征。这种卷积方法的核心思想是,通过动态形状的卷积核来增强感知能力,针对管状结构的特征提取进行优化,所以将这个卷积针对于YOLOv11的分割头进行融合是非常合适的,当然本文的检测头也支持用于目标检测,但是我将其设计出来是主要为了分割的读者使用的。

Snu77的博客 3433

Spring Cloud Stream的介绍和使用

Spring Cloud Stream 是一个用于构建消息驱动型微服务的框架。它是 Spring Cloud 生态系统中的一个组件,建立在 Spring Boot 之上,旨在简化和统一消息中间件的集成和使用。

c103363的博客 3543

2025届程序技术类笔试题

希尔排序在直接插入排序的基础上进行了改进,它通过比较相距一定间隔的元素来进行,各轮比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一轮排序为止。某人逆着水流的方向向岸边划船,每次行进前进x米后需要休息一下,休息期间船会自行倒退y米,每次休息后再次行进,前进距离缩短1/5,若起始距离岸边为m米,问:能否到达岸上,需要行进多少次才能上岸。直接插入排序的原理是将第i个元素插入前面i-1个已排好序的记录中,将比第i个元素大的记录依次向后移动一个位置,将第i个元素插入空位。第二轮相邻比较,后移2次。

博客 599

Spring Cloud微服务架构图

Spring Cloud微服务架构图 相关技术名词说明 Spring Cloud Gateway SpringCloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。 SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信

yanyuan_1118的专栏 2843

Sigrity System Explorer ViaWizard模式进行过孔建模和仿真分析操作指导

点击TVac_lower tdvac_lower,自动跳转到2D时域曲线,查看最小低电平穿过VIL(ac)max电压的延时,结果如下。点击TVac_high tdvac_high,自动跳转到2D时域曲线,查看最小高电平穿过VIH(ac)min电压的延时,结果如下。点击max Vix_Rise,自动跳转到2D时域曲线,查看上升边PN交叉点与参考电压VREF(dc)的偏差,结果如下。Threshold:阈值,软件自带3个模板,default,Tr01,Tr02,本例选择Default。

weixin_54787054的博客 572

Open3D 计算点云的倒角距离(Chamfer Distance)【2025最新版】

;Chamfer Distance距离可以计算生成点云数据与标签点云数据之间的平均最短点距离。Open3D可以直接用来计算点云的Chamfer Distance距离。博客长期更新,本文最近一次更新时间为:2025年2月18日。

点云侠的博客 3254

微服务系列(二)常见的各类组件名称介绍

Feign 是一个声明式的、模板化的 HTTP 客户端工具,用于简化基于 HTTP 的服务间通信。它是 Netflix 开源的一部分,旨在简化和优化服务之间的 RESTful API 调用。使用 Feign,开发者可以定义一个接口,通过注解的方式来描述服务间的 HTTP 调用。Feign 根据接口定义自动生成实现类,隐藏了底层的 HTTP 请求细节,使得服务间的通信更加简单和易于维护。

wangchao4732的博客 489

华为OD 面试手撕代码真题【判断链表是否有环】

华为OD 面试手撕代码真题【判断链表是否有环】

MISAYAONE的博客 7241

Salt 状态模块 rabbitmq_policy 实战:用声明式 SLS 管理 RabbitMQ 策略(Policy)

`rabbitmq_policy` 是 Salt 中用于声明式管理 RabbitMQ 策略(Policy)的状态模块,通过 `rabbitmq_policy.present` 与 `rabbitmq_policy.absent` 两个状态函数,即可在 Minion 上以幂等的方式创建、校验、更新和删除 RabbitMQ 队列/交换机策略(典型场景如全局 HA 高可用策略 `{"ha-mode":

gitblog_00921的博客 417

【100%通过率】华为od机试C卷【出差 / 员工派遣】C++ 实现

某公司部门需要派遣员工去国外做项目。现在,代号为 x 的国家和代号为 y 的国家分别需要 cntx 名和 cnty 名员工部门每个员工有一个员工号 (1,2,3,......),工号连续,从 1开始。部长派遣员工的规则:

MISAYAONE的博客 2196

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

RabbitTemplate :简化与 RabbitMQ 消息代理的交互

是 Spring AMQP 提供的一个高级消息模板,它封装了与 RabbitMQ 服务器交互的底层细节,使得开发者能够以一种更加声明式的方式发送和接收消息。通过,我们可以发送消息到指定的交换机和队列,也可以从队列中接收消息。是 Spring AMQP 中一个非常重要的类,它简化了与 RabbitMQ 消息代理的交互过程,使得开发者能够更加方便地发送和接收消息。通过合理配置和使用,我们可以构建高效、可靠的消息传递系统,以满足各种业务场景的需求。

wddblog的博客 1554

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SpringAMQP 用户管理组件 RabbitAdmin 以及声明式配置

RabbitAdmin 类可以很好的操作 rabbitMQ,在 Spring 中直接进行注入即可。 !!! 注意,autoStartup 必须设置为 true,否则 Spring 容器不会加载 RabbitAdmin 类。 复制代码 RabbitAdmin 类 的底层实现就是从 Spring 容器中获取 exchange、Bingding、routingkey 以及queue 的 @bea...

weixin_33805557的博客 1430

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Zipkin RabbitMQ 测试镜像解析:构建、配置与 RabbitMQ Collector 集成

`zipkin-rabbitmq` 是 Zipkin 仓库中用于集成测试的 Docker 测试镜像,它以 Alpine Linux 版 RabbitMQ 为基础,预置了 Zipkin [RabbitMQ collector](https://link.gitcode.com/i/8627e545aded6f08378d33ce81b4d3f5) 所需的 `guest` 用户与默认 `zipkin`

gitblog_01143的博客 1056

5分钟跑通Qwen3.5-9B-MLX-4bit:Mac本地部署Qwen3.5多模态大模型完全教程(附避坑清单)

**Qwen3.5-9B-MLX-4bit** 是专为 Apple Silicon(M1/M2/M3/M4)芯片优化的 4-bit 量化多模态大模型,支持图片与视频理解。本文手把手带你完成 **Mac本地部署 Qwen3.5** 多模态模型:全程只需 5 分钟、零 GPU 成本,并附新手最常用的避坑清单。 ## 📦 一、Qwen3.5-9B-MLX-4bit 是什么? Qwen3.5-9B-

gitblog_00743的博客 1001

RabbitMQ:常用命令

rabbitmqadmin 覆盖了 Management UI 大部分操作,适合脚本化和批量化管理【(根据您的部署环境和业务规模,选择合适的命令与拓扑方案即可实现平滑运维与水平扩展。支持交互式输入、从 stdin 读取或直接在命令行提供密码,需注意 shell 转义【(若超时或节点少于 Raft quorum 将失败【(这些命令既可交互执行,也可集成到 Prometheus 等监控报警流程中【(:以满足 Raft 大多数(quorum)要求,并容忍单节点故障【(列出用户名、标签(tags)和密码状态【(

喝醉酒的小白 1154

RabbitMQ: 实现高效消息监听之从基础到自动配置

RabbitListener 简化了 RabbitMQ 消息监听,通过注解实现零侵入式开发。核心优势包括注解驱动、自动声明交换机和队列、灵活配置集成。支持声明式创建资源,配置TTL和死信队列等高级特性。在NestJS中可通过环境变量动态加载配置,自动管理连接和通道。提供三种实用方案:基础监听、自定义连接和多队列绑定,涵盖消息确认、死信处理等场景。还支持连接池管理和消息序列化配置,实现完整的消息队列解决方案。该方案显著提升开发效率,降低RabbitMQ使用复杂度。

Wang的专栏 1745

第3章:RabbitMQ 配置体系——rabbitmq.conf 与 advanced.config

本章聚焦RabbitMQ配置体系,厘清rabbitmq.conf(sysctl风格)、advanced.config(Erlang term)与环境变量三层覆盖关系——冲突项以advanced为准,环境变量仅在空数据目录初始化时生效。给出单机生产基线10-promo.conf,包含内存/磁盘绝对水位(容器优先)、心跳60s、通道上限2048、关闭废弃特性,并强调cluster_partition_handling在4.3+已失效需静态扫描拦截。

davidwang456的专栏 338

探索云原生消息处理新纪元:RabbitMQ Messaging Topology Kubernetes Operator深度解析

探索云原生消息处理新纪元:RabbitMQ Messaging Topology Kubernetes Operator深度解析 随着微服务架构和云原生应用的兴起,对于高效、灵活的消息传递解决方案的需求日益增长。在此背景下,RabbitMQ Messaging Topology Kubernetes Operator 横空出世,它为开发者提供了一种全新的途径,以声明式的方式在Kubernetes集...

gitblog_01071的博客 1071

RabbitMQ:高效消息处理与资源管理实践

本文探讨了NestJS与RabbitMQ的高级集成方案,重点介绍了声明式资源管理和三种典型应用模式。通过@golevelup/nestjs-rabbitmq库,开发者可以简化RabbitMQ的复杂操作,包括自动管理连接池、声明式配置交换机和队列等资源。文章详细展示了RabbitMQAdmin的声明式配置方法,并提供了三种工程实现方案:基础生产者-消费者模型、RPC请求响应模式以及基于死信队列的容错机制。这些方案通过注解驱动的方式,显著提升了代码的可维护性,同时避免了手动管理RabbitMQ底层资源带来的复杂

Wang的专栏 799

RabbitMQ Plugin for Grails 是一个用于简化 Grails 应用程序中 RabbitMQ 消息队列集成的插件

- **消息消费**:提供了两种消费消息的方式,一是从命名队列中消费,二是通过订阅交换器(传统的发布/订阅模型)。 - **队列和交换器配置**:支持在 `Config.groovy` 中使用 DSL 方式声明队列和交换器,并可配置队列的属性(如 `autoDelete`、`durable`、`exclusive` 等)。 - **事务支持**:支持事务,可确保消息的可靠发送和接收。

[Blog][Domain] programb.blog.youkuaiyun.com 458
上一篇: RabbitMQ: 高级特性实战优化和经验小结
下一篇: RabbitMQ: 消息发送、连接管理、消息封装与三种工程方案
Wang's Blog
博客等级 码龄12年 7438粉丝 2422原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值