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

消息队列的消息异常处理

目录

1.如果消费端发生异常导致消息消费失败,补偿策略是什么

2.消息队列重试的话,如何保证消费的幂等性?

3.消息重发机制


1.如果消费端发生异常导致消息消费失败,补偿策略是什么

生产者发送消息失败:

设置mandatory=true;交换器无法根据自身的类型和路由键找到一个符合条件的队列的话,那么RabbitMQ会调用Basic.Return命令将消息返回给生产者

生产者将信道设置成confirm(确认)模式:一旦信道进入confirm模式,所有在该信道上面发布的消息都会被指派一个唯一的ID(从1开始),一旦消息被投递到所有匹配的队列之后,RabbitMQ就会发送一个确认(Basic.Ack)给生产者(包含消息的唯一ID)

消费者消费消息失败:

设置死信队列:消息进入死信队列,设置重新发送到正常队列的重试时间和重试间隔,重新发送到正常队列

将消息存入本地客户端:进行重发

补偿策略:当消息消费失败后,进入死信队列,获取对应死信队列的消息长度,当大于0时并判断未超过重试次数,自动将消息从死信队列迁移到正常队列

死信队列:如果队列里的消息出现存活时间超过设置的生存时间(TTL)时间、消息数量已经超过最大队列长度,该消息将成为“死信”。

“死信”消息会被RabbitMQ进行特殊处理,如果配置了死信队列信息,那么该消息将会被丢进死信队列中,如果没有配置,则该消息将会被丢弃。

2.消息队列重试的话,如何保证消费的幂等性?

消费的幂等性:消费者对某条消息重复消费的情况时,重复消费的结果与消费一次的结果是相同的,并且多次消费并未对业务系统产生任何负面影响

利用数据库的唯一约束实现幂等:比如将订单表中的订单编号设置为唯一索引,创建订单时,根据订单编号就可以保证幂等

利用redis的原子性:每次操作都直接set到redis里面,然后将redis数据定时同步到数据库中

版本号机制:给业务数据增加一个版本号属性,每次更新数据前,比较当前数据的版本号是否和消息中的版本一致,如果不一致则拒绝更新数据,更新数据的同时将版本号+1

3.消息重发机制

消息重发:消息发送失败或者消费者消费失败后重新发送消息

在消息收发过程中,若Consumer消费某条消息失败或者消费超时,则云消息队列会在重试间隔时间后,将消息重新投递给消费者消费,若达到最大重试次数后消息还未被成功消费,则将消息投递至死信队列,通过私信消息解决业务异常

消息重试行为:

重试间隔:上一次消费失败或超时后,距下次消息可被重新消费的间隔时间

最大重试次数:消息消费失败后,可以被消息队列重复投递的最大次数

http://www.lryc.cn/news/140112.html

相关文章:

  • APP上线为什么要提前部署安全产品呢?
  • SQL注入之HTTP头部注入
  • 软考高级系统架构设计师系列论文九十七:论软件三层结构的设计
  • 【C++心愿便利店】No.2---函数重载、引用
  • 掌握Six Sigma:逐步解锁业务流程优化的秘密之匙
  • Python中使用print()时如何实现不换行
  • WordPress使用子主题插件 Child Theme Wizard,即使主题升级也能够保留以前主题样式
  • 人员跌倒检测识别预警
  • C#,《小白学程序》第二课:数组与排序
  • 2023有哪些更好用的网页制作工具
  • Keepalived(一)
  • cs231n assignment3 q5 Self-Supervised Learning for Image Classification
  • 电商首屏设计
  • SpringBoot集成Redis
  • qt 的基础学习计划列表
  • CSS中如何改变鼠标指针样式(cursor)?
  • SpringMVC-2-Spring MVC拦截器详解:从入门到精通
  • 探索AIGC人工智能(Midjourney篇)(一)
  • 【IMX6ULL驱动开发学习】11.Linux之SPI驱动
  • 什么是网络中的服务质量 (QoS),其相关技术和关键指标有哪些?
  • Django(4)-Django 管理页面
  • js的使用之时间如何定义,窗口加载事件
  • 会声会影2023全新中文专业版下载安装教程
  • excel处理公式获得最终值--------------gxl
  • 变量函数及销毁函数中的变量-PHP8知识详解
  • Unity Alembic闪烁问题
  • 结构型模式-适配器模式
  • 数据结构:线性表之-顺序表
  • 请你说说json 序列化功能
  • Wireshark流量分析