当前位置: 首页 > article >正文

RabbitMQ的高级特性-消息确认机制

对于RabbitMQ发送消息到消费端的可靠性保障

引入:发送者发送消息后,到达消费端之后会出现一下两种情况:

①消息处理成功

②消息处理异常

RabbitMQ向消费者发送消息之后, 就会把这条消息删掉, 那么第两种情况, 就会造成消息丢失,要保证消费端能够成功接收到消息,于是RabbitMQ就引入了消息确认机制

在RabbitMQ中:

消费者在订阅队列时,可以指定 autoAck 参数, 根据这个参数设置, 消息确认机制分为以下两种:
① ⾃动确认: 当autoAck 等于true时, RabbitMQ 会⾃动把发送出去的消息置为确认, 然后从内存(或
者磁盘)中删除, ⽽不管消费者是否真正地消费到了这些消息. ⾃动确认模式适合对于消息可靠性要求不⾼的场景.
② ⼿动确认: 当autoAck等于false时,RabbitMQ会等待消费者显式地调⽤Basic.Ack命令, 回复确认信号后才从内存(或者磁盘) 中移去消息. 这种模式适合对消息可靠性要求⽐较⾼的场景.

注:

当autoAck参数置为false, 对于RabbitMQ服务端⽽⾔, 队列中的消息分成了两个部分:
⼀是等待投递给消费者的消息.
⼆是已经投递给消费者, 但是还没有收到消费者确认信号的消息.
如果RabbitMQ⼀直没有收到消费者的确认信号, 并且消费此消息的消费者已经断开连接, 则RabbitMQ会安排该消息重新进⼊队列,等待投递给下⼀个消费者,当然也有可能还是原来的那个消费者

手动确认的方法:
消费者在收到消息之后, 可以选择确认, 也可以选择直接拒绝或者跳过, RabbitMQ也提供了不同的确认应答的⽅式, 消费者客⼾端可以调⽤与其对应的channel的相关⽅法:

1. 肯定确认: Channel.basicAck(long deliveryTag, boolean multiple)  :RabbitMQ 已知道该消息并且成功的处理消息. 可以将其丢弃了.
参数说明:
1) deliveryTag: 消息的唯⼀标识,它是⼀个单调递增的64 位的⻓整型值. deliveryTag 是每个通道
(Channel)独⽴维护的, 所以在每个通道上都是唯⼀的. 当消费者确认(ack)⼀条消息时, 必须使⽤对应的通道上进⾏确认.
2) multiple: 是否批量确认. 在某些情况下, 为了减少⽹络流量, 可以对⼀系列连续的 deliveryTag 进
⾏批量确认. 值为 true 则会⼀次性 ack所有⼩于或等于指定 deliveryTag 的消息. 值为false, 则只确认当前指定deliveryTag 的消息.

2. 否定确认: Channel.basicReject(long deliveryTag, boolean requeue):RabbitMQ在2.0.0版本开始引⼊了 Basic.Reject 这个命令, 消费者客⼾端可以调⽤channel.basicReject⽅法来告诉RabbitMQ拒绝这个消息.
参数说明:
 requeue: 表⽰拒绝后, 这条消息如何处理. 如果requeue 参数设置为true, 则RabbitMQ会重新将这条消息存⼊队列,以便可以发送给下⼀个订阅的消费者. 如果requeue参数设置为false, 则RabbitMQ会把消息从队列中移除, ⽽不会把它发送给新的消费者.

3. 否定确认: Channel.basicNack(long deliveryTag, boolean multiple,boolean requeue)Basic.Reject命令⼀次只能拒绝⼀条消息,如果想要批量拒绝消息,则可以使⽤Basic.Nack这个命令. 消费者客⼾端可以调⽤ channel.basicNack⽅法来实现.

multiple参数设置为true则表⽰拒绝deliveryTag编号之前所有未被当前消费者确认的消息.

SpringBoot中的确认机制:

1. AcknowledgeMode.NONE
      这种模式下, 消息⼀旦投递给消费者, 不管消费者是否成功处理了消息, RabbitMQ 就会⾃动确认
消息, 从RabbitMQ队列中移除消息. 如果消费者处理消息失败, 消息可能会丢失.(消费者正常/异常处理:MQ删除相应的消息)
2. AcknowledgeMode.AUTO(默认)
      这种模式下, 消费者在消息处理成功时会⾃动确认消息, 但如果处理过程中抛出了异常, 则不会确认消息.(消费者正确处理:消息自动确认,消费者异常处理:消费会不停重试)
3. AcknowledgeMode.MANUAL
      ⼿动确认模式下, 消费者必须在成功处理消息后显式调⽤ basicAck ⽅法来确认消息. 如果消
息未被确认, RabbitMQ 会认为消息尚未被成功处理, 并且会在消费者可⽤时重新投递该消息, 这
种模式提⾼了消息处理的可靠性, 因为即使消费者处理消息后失败, 消息也不会丢失, ⽽是可以被
重新处理.

配置代码:

spring:
  rabbitmq:
    addresses: 
    listener:
      simple:
        acknowledge-mode: none/auto/manual


http://www.kler.cn/news/326198.html

相关文章:

  • http请求过程 part-2
  • 【C++前缀和 动态规划 博弈】1140. 石子游戏 II|2034
  • 【已解决】Koa 异步问题导致响应信息不能正确输出,始终为 Not Found
  • redis和mysql端口修改
  • Harmony next Native API 开发工程实践
  • Python数据分析工具:Seaborn用法示例
  • UI设计师面试整理-面向用户的设计
  • k8s pv(PersistentVolume) 状态含义
  • 全自动ai生成视频MoneyPrinterTurbo源码 在线ai生成视频源码
  • 【艾思科蓝】网络安全的隐秘战场:构筑数字世界的铜墙铁壁
  • 66 使用注意力机制的seq2seq_by《李沐:动手学深度学习v2》pytorch版
  • 生产者和消费者
  • WinRAR技巧:如何给多个压缩包设置同一个密码
  • 09_React 扩展
  • 网络安全:保护您的数字世界
  • 基于单片机电容测量仪仿真设计
  • 基于大数据的高校新生数据可视化分析系统
  • 华为源NAT技术与目的NAT技术
  • unity 打包安卓 RenderTexture显示红色
  • 命令回显echo
  • SpringBoot使用@Slf4j注解实现日志输出
  • uniapp数据缓存
  • golang学习笔记20-面向对象(二):方法与结构体【重要】
  • React和Vue对比
  • Oracle数据库物理结构操作管理
  • kubeadm部署k8s集群,版本1.23.6;并设置calico网络BGP模式通信,版本v3.25--未完待续
  • C++ STL(1)迭代器
  • Kafka 在 Linux 下的集群配置和安装
  • 生产k8s 应用容器内存溢出OOMKilled问题处理
  • Ubuntu 镜像替换为阿里云镜像:简化你的下载体验