Rabbitmq消息重复消费问题(幂等性保障)

消息百分百投递架构

在《消息可靠性保证》篇章中,我通过生产者确认机制保障了消息会发送到MQ中,但是在生产者与MQ建立过程的时候出现了网络抖动,连接建立失败,生产者就感知不到MQ返回的ack/nack,无法完全保障消息投递到MQ中,因此这里介绍如何保障生产者百分百将消息投递到MQ。
消息百分百投递架构图

  • step1:首先把消息信息(业务数据)存储到数据库中,紧接着,我们再把这个消息记录也给存储到一张消息记录表中,并且在消息记录表中指定一个状态字段status来记录消息的投递状态。将status设为0,表示还未被投递
  • step2:发送消息给MQ Broker节点(采用Confirm确认机制发送消息,会有异步的返回结果)
  • step3,4:生产者端接收MQ Broker节点返回的Confirm确认消息结果,然后进行更新消息记录表中的消息状态。将status设为1,表示投递成功
  • step5:但是在消息确认这个过程中可能出现网络抖动,MQ Broker端异常等原因导致 返回消息失败,这个时候需要生产者对消息进行可靠性投递,保障消息不丢失。所以我们需要一个定时任务(比如每1分钟拉取一些消息的状态信息,当然这个消息也可以设置一个超时时间,比如超过1分钟status=0,也就说明1分钟内,该消息没有被投递成功,那么就会被定时任务拉取出来)
  • step6:接下来我们把status=0的消息进行重新投递 retry send
  • step7:我们可以设置最大重试次数,比如投递3次还是失败,就可以把该消息的状态status标记为2,交给人工解决(或者把这些记录到一张失败表中)

通过以上步骤就能保障消息的百分百投递成功!!!

引出重复消费问题

image.png
step2 网络抖动没有投递成功,并不会照成重复消费问题,因为消息并没有投递到MQ中。而step3 此时MQ已经接收到该消息,返回ack时出现网络抖动,导致生产者接收不到MQ返回的ack,就误以为没有投递成功,将消息又重新投递一遍。造成消费者重复消费!!!

解决重复消费问题

解决消息重复消费问题,需要在消费端考虑消息的幂等性。

幂等性:对一个接口调用一次和调用多次得到的结果是一样的

解决方案有两套

  1. 使用数据库的唯一约束
  2. 使用redis的setnx

使用数据库的唯一约束保证幂等性

单体架构

单体架构


分布式

使用雪花算法、Tinyid 等生成唯一ID给消息标识和指纹码,消息入库时作为主键进行保存,因此保证消息唯一性
优点:实现简单
缺点:
1、高并发业务下游数据库有写入性能瓶颈
2、需要
本地ID生成服务,确保外部统一生成ID服务
无法使用时可以进行兜底
**解决方案:**数据库进行分库分表,对消息ID使用算法解析路由到不同的数据库中
唯一ID+指纹码方案架构

Redis原子性

利用redis的setnx命令,天然具有幂等性,从而实现不重复消费
**优点:**性能高,AOF模式数据不丢失
缺点:
1. 数据同步入库需要考虑到数据库和Redis之间的原子性
2. 消息不同步入库,Redis定时同步到数据库的策略需要具体设计

**
**

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/249862.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

配电室环境智能监测系统

配电室环境智能监测系统是一种先进的在线监测系统,依托电易云-智慧电力物联网,用于实时监测配电室内部的环境参数,包括温度、湿度、SF6气体浓度、烟雾浓度等。该系统具有以下功能特点: 实时监测:系统能够实时监测配电室…

windows wsl2 ubuntu上部署 redroid云手机

Redroid WSL2部署文档 下载wsl内核源码 #文档注明 5.15和5.10 版本内核可以部署成功,这里我当前最新的发布版本 #下载wsl 源码 wget --progressbar:force --output-documentlinux-msft-wsl-5.15.133.1.tar.gz https://codeload.github.com/microsoft/WSL2-Linux-Ker…

nginx 1.24.0 安装nginx最新稳定版

1.官网: nginx: download 2. 选择稳定版: 3. 可以下载,然后上传服务器,也可以wget获取: cd /home wget https://nginx.p2hp.com/download/nginx-1.24.0.tar.gz 4. 放入/home 下。并解压缩,重命名nginx;…

基于ssm电影网站源码和论文

随着Internet的发展,人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化,网络化和电子化。它将是直接管理电影网站的最新形式。本论文是以构建电影网站为目标,使用 java技术制作,由管理员和用户两大部分组成。…

R语言|分面中嵌入趋势线

简介 关于分面的推文,小编根据实际科研需求,已经分享了很多技巧。例如: 分面中添加不同表格 分面中添加不同的直线 基于分面的面积图绘制 分面中的细节调整汇总 基于分面的折线图绘制 最近科研中又遇到了与分面相关的需求:…

【WINCC制作水管水流动画】

WINCC简单制作水管水流动画 详情如下图所示: 1.首先用布化好管道,同时在管道内部画好折线图用以表示水流路径 2.选中折线图调整全局颜色方案 3.选择线条颜色 4.调整线条的线宽和线型 5.效果…

Enterprise Portal Standard Edition [WS_ENT_STD]

拾取坐标系统 i18n internationalization-CSDN博客 另外一种网站 Content Management System(CMS)-CSDN博客

【Unity 实用工具篇】| 游戏多语言解决方案,官方插件Localization 实现本地化及多种语言切换

前言 【Unity 实用工具篇】| 游戏多语言解决方案,官方插件Localization 实现本地化及多种语言切换一、多语言本地化插件 Localization1.1 介绍1.2 效果展示1.3 使用说明 二、 插件导入并配置2.1 安装 Localization2.2 全局配置 三、多语言映射表3.1 创建多语言文本配…

Git 使用教程(超级详细)

目录 一:Git二:SVN与Git的的区别三、安装Git四:常规操作五:远程仓库六:创建与合并分支七:bug分支八:多人协作九:git可视化工具 Git Git 是一种分布式版本控制系统,用于…

Knife4j-的使用(详细教程)

参考文档:Knife4j-的使用(详细教程)_knife4j使用-CSDN博客 前言 之前有写过 swagger 怎么使用的教程,但是现在很多项目用的接口文档其实是 Knife4j,Knife4j 它是对 swagger 在线接口文档的一个增强,按照官网的话说就是给 swagger 做了一个更…

数据结构之----数组、链表、列表

数据结构之----数组、链表、列表 什么是数组? 数组是一种线性数据结构,它将相同类型的元素存储在连续的内存空间中。 我们将元素在数组中的位置称为该元素的索引。 数组常用操作 1. 初始化数组 我们可以根据需求选用数组的两种初始化方式&#xff…

Redis分布式锁存在哪些问题,该如何解决?

假设有这样一个场景,在一个购票软件上买一张票,但是此时剩余票数只有一张或几张,这个时候有几十个人都在同时使用这个软件购票。在不考虑任何影响下,正常的逻辑是首先判断当前是否还有剩余的票,如果有,那么…

《Global illumination with radiance regression functions》

总结一下最近看的这篇结合神经网络的全局光照论文。 论文的主要思想是利用了神经网络的非线性特性去拟合全局光照中的间接光照部分,采用了基础的2层MLP去训练,最终能实现一些点光源、glossy材质的光照渲染。为了更好的理解、其输入输出表示如下。 首先…

如何解决Session共享问题?

解决会话(Session)共享问题,特别是在分布式或负载均衡环境中,通常涉及一些关键策略。 以下是一些常用的方法来解决会话共享问题: 粘性会话(Sticky Sessions): 描述:粘性会…

好用的硬盘分区工具,傲梅分区助手 V10.2

傲梅分区助手软件可以帮助用户在硬盘上创建、调整、合并、删除分区,以及管理磁盘空间等操作。它可以帮助你进行硬盘无损分区操作。 支持系统 目前这款软件支持 Windows 7、Windows 8、Windows 10、Windows 11 等个人系统,还支持 Windows 2012/2016/2019…

PixPin带有截图/贴图/长截图/文字识别/标注的截图工具,很好用

官网地址:PixPin 截图/贴图/长截图/文字识别/标注 | PixPin 截图/贴图/长截图/文字识别/标注 确实挺好用的,推荐一下

camera卷帘快门(Rolling Shutter)与全局快门(Global Shutter)

首先来看一下什么叫快门: 快门是照相机用来控制感光元件有效曝光时间的装置。可以理解为光线要想打到相机传感器上必经的一道门。如果快门关着,那么光线进不去,感光元件就无法曝光;门开了,光线进来了,感光元…

世微 DW01 锂电池保护IC 充电器检测过充保护

一、 描述 DW01A 是一个锂电池保护电路,为避免锂电池因过充电、过放电、电流过大导致电池寿命缩短或电池被损坏而设计的。它具有高精确度的电压检测与时间延迟电路。 二、 主要特点 工作电流低 过充检测 4.3V,过充释放 4.05V; 过放检测 2.4…

从零开始的开发教学:搭建企业内训APP

随着企业内训需求的不断增加,搭建一款高效、灵活的企业内训APP成为许多公司的迫切需求。本文将带领读者一步步从零开始,通过简明扼要的教学,构建一款符合企业需求的内训应用程序。 第一步:明确需求和目标 在着手开发之前&#x…

clickhouse函数记录

日期函数 SELECT formatDateTime(create_time,%Y-%m-%d) AS time FROM xx.xx;