RabbitMQ: 高级特性实践之生产者确认与消费者容器实现

Java教程:RabbitMq讲解与SpringBoot项目如何对接RabbitMq实现生产者与消费者 RabbitMQ是一个开源的消息代理软件,实现了高级消息队列协议(AMQP)。它是一个面向消息的中间件,用于在分布式系统中存储和转发消息。RabbitMQ的主要组件包括生产者、消费者和代理,其中代理负责将消息路由到相应的消费者。这种模型允许应用程序在不直接依赖彼此的情况下进行通信,从而实现异步和解耦。RabbitMQ支持多种客户端,如Python、Java、PHP等,并且可以在不同平台上运行,包括嵌入式系统、多核心集群以及基于云端的服务器。 阅读详情

生产者端:消息确认(Publisher Confirms)与返回机制(Return Messages)


1 ) 技术背景:

RabbitMQ 通过 Publisher Confirms 确保消息到达 Broker,通过 Return Messages 处理无法路由的消息。在 NestJS 中需显式开启这两项特性,并解决异步回调中的消息追踪问题。

2 ) 关键配置步骤

  1. 启用 ConnectionFactory 特性

    // rabbitmq.config.ts
    import { RabbitMQModule } from '@golevelup/nestjs-rabbitmq';
    import { ConfirmChannel } from 'amqplib';
    
    @Module({
      imports: [
        RabbitMQModule.forRoot(RabbitMQModule, {
          exchanges: [{ name: 'order_exchange', type: 'direct' }],
          uri: 'amqp://localhost:5672',
          connectionInitOptions: { wait: true },
          // 开启生产者确认与返回模式
          connectionManagerOptions: {
            connectionOptions: {
              confirm: true, // 等效于 setPublisherConfirmType(ConfirmType.CORRELATED)
              clientProperties: { publisherReturns: true } // 开启消息返回
            }
          }
        })
      ]
    })
    export class RabbitConfigModule {}
    
  2. 配置 RabbitTemplate 回调

    // rabbit.service.ts
    import { RabbitRPC, RabbitSubscribe } from '@golevelup/nestjs-rabbitmq';
    import { RabbitMQProducer } from '@golevelup/nestjs-rabbitmq';
    
    @Injectable()
    export class RabbitService {
      constructor(private readonly producer: RabbitMQProducer) {}
    
      async sendOrderMessage(orderId: string) {
        const correlationId = orderId.toString();
        await this.producer.publish('order_exchange', 'order.routing.key', 
          { id: orderId },
          { 
            correlationId,
            mandatory: true, // 触发 ReturnCallback
            headers: { 'x-delay': 5000 }
          }
        );
    
        // 注册全局回调(需在模块初始化时完成)
        this.producer.registerConfirmCallback((ack: boolean, correlation: any) => {
          if (ack) {
            console.log(`[Confirm] Message ${correlation.id} confirmed`);
          } else {
            console.error(`[Confirm] Message ${correlation.id} nacked`);
          }
        });
    
        this.producer.registerReturnCallback((returned) => {
          console.error(
            `[Return] Message ${returned.properties.correlationId} returned: ` +
            `Code=${returned.replyCode}, Reason=${returned.replyText}`
          );
        });
      }
    }
    
  3. 异步回调关联消息
    使用 correlationId 绑定消息与业务标识(如订单ID),解决异步确认中的消息追踪问题:

    // 消息发送时携带 correlationId
    await this.rabbitService.sendOrderMessage('order_123');
    

消费者端:SimpleMessageListenerContainer 高级特性


容器核心能力:

  • 多队列监听
  • 并发消费者线程池管理
  • 手动消息确认(Manual Ack)
  • 消费端限流(QoS Prefetch)

消费者容器配置

// order.consumer.ts
import { RabbitSubscribe } from '@golevelup/nestjs-rabbitmq';
 
@Controller()
export class OrderConsumer {
  @RabbitSubscribe({
    exchange: 'order_exchange',
    routingKey: 'order.routing.key',
    queue: 'order_queue',
    queueOptions: { durable: true },
    // 关键参数配置
    allowNonJsonMessages: true,
    prefetchCount: 1, // 消费端限流 (QoS)
    ackMode: 'MANUAL' // 手动确认模式
  })
  async handleOrderMessage(
    message: {}, 
    @Ctx() context: AmqpConnection
  ) {
    const { channel, deliveryTag } = context.getChannelRef();
    try {
      console.log(`Processing message: ${JSON.stringify(message)}`);
      // 业务逻辑处理...
      channel.ack(deliveryTag, false); // 手动确认
    } catch (error) {
      channel.nack(deliveryTag, false, true); // 重回队列
    }
  }
}

高级特性实现

  1. 手动消息确认
    通过 ackMode: 'MANUAL' 及 channel.ack() 控制消息确认时机,异常时调用 nack() 实现重回队列。

  2. 消费端限流
    prefetchCount: 1 限制每次仅预取一条消息,避免消费者过载。

  3. 动态线程池调整
    在 @golevelup/nestjs-rabbitmq 中通过装饰器参数控制并发:

    @RabbitSubscribe({
      prefetchCount: 5, // 每个信道预取量
      concurrency: 3    // 并发消费者数量
    })
    

工程示例:NestJS 集成 RabbitMQ 的三种方案


1 ) 方案1:基础生产者-消费者模型

// 生产者
@Injectable()
export class ProducerService {
  constructor(private amqpConnection: AmqpConnection) {}
 
  async publishEvent(exchange: string, routingKey: string, payload: object) {
    await this.amqpConnection.publish(exchange, routingKey, payload);
  }
}
 
// 消费者
@RabbitSubscribe({ exchange: 'events', routingKey: '#' })
handleEvent(msg: {}) {
  console.log(`Received: ${JSON.stringify(msg)}`);
}

2 ) 方案2:RPC 模式(请求-响应)

// 服务端
@RabbitRPC({
  exchange: 'rpc_exchange',
  routingKey: 'math.sqrt',
  queue: 'sqrt_queue'
})
async sqrtRPC(num: number) {
  return { result: Math.sqrt(num) };
}
 
// 客户端调用
const response = await this.amqpConnection.request<{ result: number }>({
  exchange: 'rpc_exchange',
  routingKey: 'math.sqrt',
  payload: 9
});

3 ) 方案3:死信队列(DLX)实现延迟消息

// 配置死信交换器
@Module({
  imports: [
    RabbitMQModule.forRootAsync(RabbitMQModule, {
      useFactory: () => ({
        exchanges: [
          { 
            name: 'dlx_exchange', 
            type: 'direct',
            options: { durable: true }
          }
        ],
        queues: [
          {
            name: 'delayed_queue',
            options: {
              deadLetterExchange: 'dlx_exchange',
              messageTtl: 10000 // 10秒后转入死信队列
            }
          }
        ]
      })
    })
  ]
})

RabbitMQ 运维命令参考


# 查看队列状态
rabbitmqctl list_queues name messages_ready messages_unacknowledged
 
# 监控信道预取设置
rabbitmqctl list_channels name prefetch_count
 
# 创建死信队列
rabbitmqadmin declare queue name=dlx_queue durable=true
rabbitmqadmin declare exchange name=dlx_exchange type=direct
rabbitmqadmin declare binding source=dlx_exchange destination=dlx_queue routing_key=dead

关键总结:

  1. 生产者确认需同时开启 confirm 和 publisherReturns 参数,通过 correlationId 关联异步回调
  2. 消费者容器通过 @RabbitSubscribe 实现线程池/限流/手动ACK的集中管理
  3. 工程方案选择取决于场景:基础消息(方案1)、同步调用(方案2)、延迟任务(方案3)
  4. 运维核心:prefetch_count 控制消费速率,dead-letter-exchange 处理异常消息
世界坐标系/相机坐标系/图像坐标系 转换 目录一、各坐标系简要介绍二、坐标系转换2.1 世界坐标系转为相机坐标系2.2 相机坐标系转为物理图像坐标系2.3 物理图像坐标系转为图像坐标系2.4 总结2.5 为什么要使用齐次坐标参考文献 一、各坐标系简要介绍 首先介绍数字图像处理领域中的图像坐标系,如上图左图所示,坐标系O_0为图像坐标系,其原点是在图像的左上角,每一个像素通过其所在位置的列数和行数索引 (u,v) 来表示。 另外需要建立图像坐标与物理单位的关系,而后才能将目标的真实世界坐标转换为图像坐标。即建立以物理单位表示的物理图像坐标系(有些文 阅读详情

相关推荐

DDR Study - LPDDR5 Power-Up and Initialization Sequence

本文深入解析LPDDR5内存的上电初始化流程,涵盖电源斜坡、复位信号释放和初始化训练等关键阶段。通过实际案例分享,详细探讨了电源轨时序、RESET信号处理、ZQ校准和CA总线训练等核心技术要点,帮助硬件工程师规避常见设计陷阱,确保DDR内存稳定运行。

weixin_42523792的博客 304

【MQ篇】RabbitMQ的消费者确认机制实战!

RabbitMQ 把消息发给消费者,如果消费者还没来得及处理完就“嗝屁了” 😵‍💫(程序崩溃、网络断开、处理异常),那这条消息对于 RabbitMQ 来说可能已经“送达”了,然后就被无情地从队列里删除了!如果在收到确认信号之前,消费者断开连接了,或者明确表示处理失败了,RabbitMQ 就会知道这条消息“有问题”,会考虑把这条消息重新发给其他消费者,或者等这个消费者恢复后再发给它。但如果家里没人,包裹被风吹走了 💨,或者被隔壁老王的狗叼走了 🐶📦💥,或者你拿到包裹后,手一滑掉粪坑里了 🚽…

qq_56158663的博客 3555

使用KITTI数据集测试不同算法的性能

该文章将使用同一个kitti数据集来测试不同算法的性能,目前已经测试的算法包括:LIO-SAM,FAST-LIO2,Point-LIO,Faster-LIO。

wwtx的博客 2586

SpringBoot整合RabbitMq实现生产者、消费者,RabbitMQ的简单介绍

安装RabbitMQ 此处环境为windows下测试案例使用,故整体是在windows下搭建的环境 1.首先下载安装Erlang 下载路径https://www.erlang.org/downloads,双击下载文件 选择安装路径 为Erlang设置环境变量 在环境变量path中添加D:\software\javamq\erl10.0.1\bin (路径为安装路径的bin) 打开cmd指令,输入 erl -version erl 此时,表示erlang安装成功 2.下载

gangye19970101的博客 1万+

解决创建conda环境时Solving environment: failed 和 ResolvePackageNotFound 的错误

环境配置文件是在别的机器上导出的,文件里的软件包是按照导出文件的机器配置的,因此导出的时候,把这些包的详细信息也导了出来,即第二个等号后面跟着的信息,当我们按照这个文件创建环境时,conda就会根据我们机器的配置信息,按照配置文件里包的详细信息,去找这个包,那当然找不到,结果发现“查无此包”,因此也就会报上面的错误。上面找到了问题的所在之处,解决起来就很简单了,只需要在配置文件 environment.yml 中将包的详细信息删除,也就是第二个等号后面的内容。然而升级超级慢不说,也没有解决我的问题。...

番茄炒蛋三分糖 4万+

博图V16与840D sl数控系统PLC编程实战指南

本文为西门子840D sl数控系统的PLC编程实战指南,详细介绍了如何使用博图V16软件配置编程环境。内容涵盖从项目创建、核心程序块(如DB、FB)解析到OB1主循环编程的完整流程,并提供了高级调试技巧与联调避坑指南,帮助工程师快速上手并高效完成系统集成与逻辑控制。

weixin_29193259的博客 528

rabbitmq 生产者与消费者的确认

一 @Service public class PushSender { @Autowired RabbitTemplate rabbitTemplate; private static final Logger log = LoggerFactory.getLogger(PushSender.class); public void sendMsg(){ ...

千羽的博客 711

【ROS机器人系统】实验4 ROS简单应用:激光SLAM与导航

ROS简单应用:激光SLAM与导航 (1)了解机器人和SLAM之间关系 (2)了解激光SLAM (3)了解gmapping和导航

南京大学软件工程硕士在读 2148

RabbitMQ生产者和消费者代码(单一消费者,消费容器) & 消息确认机制

生产者简单代码: package com.star; import org.springframework.amqp.core.AmqpTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Va...

liao0801_123的博客 2462

pytest学习和使用19-pytest断言失败后,怎样保持后续的断言继续执行?(pytest-assume)

【代码】pytest学习和使用19-pytes断言失败后,怎样保持后续的断言继续执行?

虫无涯的博客 1391

CDD那些事 - DID and SecurityAccess

本文介绍了SecurityAccessSID27的安全访问配置流程:1.通过StateGroups添加Level2群组;2.在Classes定义L2子功能;3.配置4步解锁流程,选择对应解锁等级;4.在DiagnosticInstance设置请求响应。同时说明了DID配置的两种方式:在DIDs页面定义或通过Identification页面创建,前者定义更全面。文章还提到ServiceList支持view/edit模式,其中edit模式可配置DID的多服务支持(如同时支持SID22读取和SID2E写入),但该

ziteng21的博客 258

RabbitMQ(四):RabbitMQ高级特性

说明:因为在yml配置文件中定义消息路由失败时的策略为true,所以当消息从交换机路由到队列失败时,会调用ReturnCallback每个RabbitTemplate只能配置一个ReturnCallback,因此需要在项目加载时添加配置:修改publisher服务,添加一个【配置类】:位置:config/commic配置类。

m0_53142956的博客 8395

自动化Ai Agent全流程实现【设计+代码】

本文探讨了人工智能代理(AI代理)如何通过自动化复杂的业务流程来帮助企业提高效率和降低成本。AI代理具有适应性、智力、自主性和可扩展性等特点,能够处理非结构化信息、在定义参数范围内做出判断、协调多个系统或利益相关者,以及处理变量输入和异常。文章详细介绍了AI代理在文件处理、客户服务、人才招聘和财务运作等领域的应用,并提供了一个逐步实现发票处理自动化的案例。此外,文章还强调了实施AI代理自动化的优势,包括效率提升、成本降低、准确性和可扩展性的改进,并提出了实施最佳实践,如从高影响力流程开始、设计人机交互、优先

FeelTouch Labs 900

RabbitMQ高级特性

本文介绍了RabbitMQ的高级特性的使用场景,以及使用方法。

大脑不能为空 1247

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

springboot整合rabbitMQ并配置消息确认(生产者消息确认和消费者消息确认)

RabbitMQ简介 RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。 AMQP :Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。 RabbitMQ 最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。具体特点包括: 可靠性(Reliability) RabbitMQ 使用一些机制来保证可

城北荆无命的博客 1839

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

RabbitMQ(高级)——发送者、MQ、消费者的可靠性以及延迟消息的实现

在RabbitMQ中,发送者的可靠性指生产者确保消息成功投递到MQ的能力。核心问题源于网络波动、MQ宕机等场景下,消息可能丢失(如发送后未到达MQ,或MQ未持久化崩溃)。例如:默认异步发送模式下,生产者无法感知消息是否真正落地,若此时MQ宕机,消息将丢失。MQ的可靠性是指消息从生产者到消费者的传递过程中不丢失、不重复且按顺序处理的保证。由于MQ默认将消息保存到内存中(以降低消息收发的延迟),此时一旦MQ宕机,内存中的消息就会丢失。

qq_63955073的博客 2612

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

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

【深入理解RabbitMQ原理】RabbitMQ 配置,生产者和消费者

RabbitMQ 配置,生产者和消费者 1. 生产者的配置 1)配置都要先声明队列 队列的声明方式: <rabbit:queueid="Bgate_Bgate1001Response_Paytt" durable="true"auto-delete="false" exclusive="false"...

王小明的专栏 9312

理解 RabbitMQ:生产者、连接、通道、交换机、队列与消费者的消息流

生产者(Producer):发送消息的一方。通常在需要时建立连接,不保持长时间连接。连接(Connection):生产者和消费者与 RabbitMQ 之间的物理 TCP 连接。多个通道可以复用一个连接,减少资源消耗。通道(Channel):轻量级的虚拟通信路径,用于执行消息的发送和接收操作。交换机(Exchange):负责根据绑定规则将消息路由到不同的队列,确保消息能够正确分发。队列(Queue):存储消息的容器,等待消费者提取和处理消息。消费者(Consumer):从队列中消费消息的程序。

吃面不喝汤的博客 2017

RabbitMQ笔记(二)SpringBoot整合RabbitMQ之simple容器(生产者)

目录一、简介二、Maven依赖三、消息确认3.1 消息发布确认ConfirmCallback3.2 消息到达确认ReturnsCallback四、核心配置类五、配置文件六、测试类TestProductService结语 一、简介   本文主要用使用Spring Boot(2.5.2)来整合RabbitMQ(2.5.2),使用simple容器实现一个生产者。本文的前提是有一个安装好的RabbitMQ的环境,及我的上一篇文章里消费者服务:   链接: RabbitMQ笔记(一)SpringBoot整合Rabbi

嘉禾嘉宁papa 6378

RabbitMQ消息确认

保证消息的可靠性主要依靠三种机制:一个是消息的持久化,一个是事务机制,一个就是消息的确认机制。1)消息持久化消息持久化是将消息写入本地文件,如果rabbitmq故障退出,在重启时会从本地文件系统读取队列数据。2)事务机制rabbitmq的事务机制提供了消息生产者和消息服务器(broker)之间的事务的开启,提交,回滚操作(如下图所示)。

qq_62898618的博客 3055

消息队列MQ(三)——RabbitMQ高级特性与RabbitMQ集群搭建

系列文章目录 消息队列MQ(一)——RabbitMQ的介绍、安装以及管理页面的使用 消息队列MQ(二)——Spring Boot整合RabbitMQ 消息队列MQ(三)——RabbitMQ高级特性与RabbitMQ集群搭建 文章目录系列文章目录前言一、简介二、搭建工程1.创建P系统(生产者)1.1 yml配置RabbitMQ属性2.创建C系统(消费者)2.1 yml配置RabbitMQ属性三、实操RabbitMQ五种工作模式3.1 HelloWorld简单模式3.1.1 RabbitMQ管理界面操作3.1

冉木的博客 900

分布式中间件:RabbitMQ确认消费机制

在分布式系统中,消息队列是实现异步通信和系统解耦的重要组件。RabbitMQ 作为一款功能强大的消息队列中间件,提供了丰富的特性来保证消息的可靠传输和消费。其中,确认消费机制是确保消息被正确处理的关键环节。本文将深入探讨 RabbitMQ 的确认消费机制,并给出不同场景下的配置示例。

weixin_55987175的博客 1006

springboot整合rabbitmq的发布确认,消费者手动返回ack,设置备用队列,以及面试题:rabbitmq确保消息不丢失

rabbitmq的发布确认方式,可以有效的保证我们的数据不丢失。消息正常发送的流程是:生产者发送消息到交换机,然后交换机通过路由键把消息发送给对应的队列,然后消费者监听队列消费消息但是如果生产者发送的消息,交换机收不到呢,又或者交换机通过路由键给对应的队列发消息时,路由键不存在呢,这些就是消息发布确认所要解决的问题# 确认消息已发送到交换机(Exchange)这个意思是开启confirm模式,这样的话,当生产者发送消息的时候,无论交换机是否收到,都会触发回调方法。

qq_26112725的博客 3762

RabbitMQ(三)消费者生产者

无

weixin_43189971的博客 2112

Hyperf AMQP 组件实战指南:RabbitMQ 生产者、消费者、延时队列与 RPC 完整解析

`hyperf/amqp` 是 Hyperf 框架中实现 AMQP(Advanced Message Queuing Protocol)标准的官方组件,主要用于对接 RabbitMQ 消息中间件。本文以当前仓库中的 [AMQP 组件文档](https://link.gitcode.com/i/90b325fb57a62dfc059427d93b55bcc2) 为主线,结合组件源码([src/amq

gitblog_00898的博客 986

RabbitMQ学习笔记

RabbitMQ 是一个基于 AMQP 协议的开源消息中间件,广泛应用于分布式系统中,支持解耦服务、异步通信和流量削峰。其核心架构包括消息队列、生产者、消费者和交换机,交换机支持 Direct、Fanout 和 Topic 三种路由模式。在 Java 客户端中,可以通过配置类或 @RabbitListener 注解声明交换机和队列。RabbitMQ 提供了生产者确认机制、数据持久化、Lazy Queue、消费者确认机制等高级特性,确保消息的可靠性和系统稳定性。此外,通过死信交换机实现延迟消息,优化了超时订单

Catcind的博客 1728
上一篇: RabbitMQ: 消息发送、连接管理、消息封装与三种工程方案
下一篇: RabbitMQ: MessageListenerAdapter 的核心作用与设计原理
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、付费专栏及课程。

余额充值