首页 > 其他分享 >消费者消息确认

消费者消息确认

时间:2023-06-28 17:34:32浏览次数:17  
标签:返回 消费者 ack auto 确认 RabbitMQ 消息

RabbitMQ是**阅后即焚**机制,RabbitMQ确认消息被消费者消费后会立刻删除。

而RabbitMQ是通过消费者回执来确认消费者是否成功处理消息的:消费者获取消息后,应该向RabbitMQ发送ACK回执,表明自己已经处理消息。

设想这样的场景:

- 1)RabbitMQ投递消息给消费者
- 2)消费者获取消息后,返回ACK给RabbitMQ
- 3)RabbitMQ删除消息
- 4)消费者宕机,消息尚未处理

这样,消息就丢失了。因此消费者返回ACK的时机非常重要。

而SpringAMQP则允许配置三种确认模式:

•manual:手动ack,需要在业务代码结束后,调用api发送ack。

•auto:自动ack,由spring监测listener代码是否出现异常,没有异常则返回ack;抛出异常则返回nack

•none:关闭ack,MQ假定消费者获取消息后会成功处理,因此消息投递后立即被删除

由此可知:

  • none模式下,消息投递是不可靠的,可能丢失

  • auto模式类似事务机制,出现异常时返回nack,消息回滚到mq;没有异常,返回ack

  • manual:自己根据业务情况,判断什么时候该ack

一般,我们都是使用默认的auto即可。

演示none模式:

  修改consumer服务的application.yml文件,添加下面内容:

spring:
  rabbitmq:
    listener:
      simple:
        acknowledge-mode: none # 关闭ack

修改consumer服务的SpringRabbitListener类中的方法,模拟一个消息处理异常:

@RabbitListener(queues = "simple.queue")
public void listenSimpleQueue(String msg) {
  log.info("消费者接收到simple.queue的消息:【{}】", msg);
  // 模拟异常
  System.out.println(1 / 0);
  log.debug("消息处理完成!");
}

测试可以发现,当消息处理抛异常时,消息依然被RabbitMQ删除了。

再次把确认机制修改为auto:

spring:
  rabbitmq:
    listener:
      simple:
        acknowledge-mode: auto # 开启ack,出现异常返回nack,成功返回ack

在异常位置打断点,再次发送消息,程序卡在断点时,可以发现此时消息状态为unack(未确定状态):

 抛出异常后,因为Spring会自动返回nack,所以消息恢复至Ready状态,并且没有被RabbitMQ删除:

 

标签:返回,消费者,ack,auto,确认,RabbitMQ,消息
From: https://www.cnblogs.com/wekenyblog/p/17512044.html

相关文章

  • RabbitMQ消息持久化
    我们看下之前启动idea测试消息发送的时候在后台生成的一条消息,现在已经在消息队列里面还没有被消费。 现在我们重启下RabbitMQ,执行linux命令:dockerrestartmq看上图实时显示的错误信息,失去连接了,接下来刷新这个页面,可以发现这个对象没有了。 说明rabbit消息并不会持久化,不......
  • 软件产品确认测试报告有什么用途?包括哪些测试内容?
    作为一项关键性的测试环节,软件产品确认测试为后续的软件开发与运维工作提供了重要的数据支持与保障;同时这也需要测试者们对于产品本身所要达到的目标和期望有着深刻的理解。对于软件测试开发与实施的工作者来说,了解产品确认测试报告的意义和常用测试方法,将有助于提高测试工作......
  • 谷粒商城项目篇12_分布式高级篇_购物车功能、消息队列RabbitMQ
    目录购物车模块vo的编写编写interceptor绑定user-key线程共享数据购物车商品的增加添加完成重定向避免刷新页面重复提交购物车商品的增删改查消息队列RabbitMQ场景理解概述docker安装RabbitMQ整合SpringBoot消息确认机制一、购物车模块需求描述在线购物车:登录状态添......
  • 如何解决MQTT消息积压
    什么是消息积压?大量消息被堆积在broker端,没有被消费。为什么会消息积压?宏观角度主要原因是:producer端生产速度>consumer端消费速度。导致producer端生产速度>consumer端消费速度的情况有多种:设计的时候就没有考虑消费速度要大于生产速度,这种情况最不应该。某一时刻......
  • 基于Redis的消息发布和订阅(广播模式)
    最近在优化一个redis的大key问题,原先的同事写法是将所有的配置都放在一个key里面,value是一个map.但是随着配置越来越多,这个map也变得很大,已经影响redis的性能.遂决定将map里面的每个配置单独出来一个key,当有配置变动的时候,通过redis的消息队列通知到其他程序.下面......
  • Python全栈工程师(23:消息队列RabbitMQ)
    谁能用通俗的语言解释一下什么是RPC框架?深入浅出RPC-浅出篇深入浅出RPC-深入篇1小时写一个分布式系统基础框架(一个java实现帮助理解RPC)RabbitMQ消息队列安装 http://www.rabbitmq.com/install-standalone-mac.html安装pythonrabbitMQmodulepipinstallpikaoreasy_......
  • SAP ABAP 动态结构实现发送企业微信应用消息
    企业微信官方接口:应用支持推送文本、图片、视频、文件、图文等类型。请求方式:POST(HTTPS)请求地址: https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN 大概思路:1.封装调用企业微信函数SE37:ZWECHAT_SEND_MESSAGE_MSGTYPE 注:   a.  ......
  • Rabbitmq:消息队列介绍、Rabbitmq安装、 基于Queue实现生产者消费者模型、基本使用(生产
    目录一、消息队列介绍1.1介绍1.2MQ解决什么问题1.3常见消息队列及比较二Rabbitmq安装2.1服务端原生安装2.2服务端Docker安装2.3客户端安装2.4设置用户和密码三基于Queue实现生产者消费者模型四基本使用(生产者消费者模型)五消息安全之ack六消息安全之durable持久化七闲置消......
  • 企业微信添加机器人,并给机器人发送消息
    找一个企业微信的群聊,点击右上角的"...",添加群机器人。  创建一个机器人  填写机器人名字,添加机器人。    保存这里的webhook地址,后面给机器人发消息,就是给这个地址post消息。具体的配置文档,可以点这里的“配置说明”去了解。 下面介绍,使用py给机器人发......
  • 如何处理 SAP Pricing - Document currency missing 的错误消息
    问题当添加一个物料主数据到Quotation行项目时,遇到如下错误消息:Pricing:Documentcurrencymissing查看这条消息的技术明细:发现是如下代码抛出的,因为字段waerk为空:将下图的currency字段维护之后,问题消失:更一般的思路错误消息"SAPPricing-Documentcurrencym......