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

怎么处理消息重发的问题?

消息队列在消息传递的过程中,如果出现传递失败的情况,发送方会重试,在重试的过程中,可能会产生重复的消息。

消息重复的情况必然存在

关于传递消息时能够提供的服务质量标准,MQTT协议给出了三种不同的标准:

  1. At most once:至多一次,消息在传递时,最多会被送达一次,一般适用于对消息可靠性要求不高的监控场景。
  2. At least once:至少一次,消息在传递时,至少会被送达一次,不允许丢消息,但是允许有少量重复消息。
  3. Exactly once:恰好一次,消息在传递时,只会被送达一次,不允许丢失也不允许重复。

我们常用的大部分消息队列提供的服务质量都是At least once,包括RocketMQ、RabbitMQ和Kafka。所以说消息队列很难保证消息不重复。

怎么解决消息重发的问题

既然消息队列不可避免的会有消息重发的问题,那么我们应该怎么去解决呢?

一般解决重复消息的办法是在消费端,让我们的消费消息的操作具有幂等性

一个幂等操作的特点是将其任意多次执行所产生的影响与一次执行的响应相同。一个幂等的方法, 使用同样的参数,对它进行多次调用和一次调用,对系统产生的影响是样的。所以我们不需要担心针对幂等的方法执行多次会对系统造成任何改变。

从对系统的影响结果来看:At least once + 幂等消费 = Exactly once。

如何实现幂等操作呢?可以从业务逻辑设计上少,将消费的业务逻辑设计成具有幂等性的操作。

接下来,我们来看三种不同方式来实现幂等。

利用数据库的唯一约束实现幂等

首先,我们可以限定,对于每个转账单每个账户只可以执行一次变更操作,在分布式系统中,这个限制实现的方法非常多,最简单的是我们在数据库中建一张转账流水表,这个表有三个字段:转账单 ID、账户 ID 和变更金额,然后给转账单 ID 和账户 ID 这两个字段联合起来创建一个唯一约束,这样对于相同的转账单 ID 和账户 ID,表里至多只能存在一条记录。

这样,我们消费消息的逻辑可以变为:“在转账流水表中增加一条转账记录,然后再根据转账记录,异步操作更新用户余额即可。”在转账流水表增加一条转账记录这个操作中,由于我们在这个表中预先定义了“账户ID转账单ID”的唯一约束,对于同一个转账单同一个账户只能插入一条记录,后续重复的插入操作都会失败,这样就实现了一个幂等的操作。我们只要写一个 SQL,正确地实现它就可以了。

只要是支持类似“INSERT IF NOT EXIST”语义的存储类系统都可以用于实现幂等操作。

为更新的数据设置前置条件

这种方式的思路是:给数据变更设置一个前置条件,如果满足条件就更新数据,否则就拒绝更新数据,在更新数据的同时,变更前置条件中需要判断的数据。这样在重复执行这个操作时,由于第一次更新数据的时候已经变更了前置条件中需要判断的依据,不满足前置条件,则不会重复执行数据更新操作。

如果我们更新的是一个复杂的业务相关数据,我们可以为数据增加一个版本号属性,,每次更新之前,比较当前数据版本号是否和消息中的版本号一致,如果不一致就拒绝更新数据,更新数据的同时将版本号加1。

记录并检查操作

这种方式的思路是:在发送消息的时候,给每条消息指定一个全局唯一ID,消费时,先根据这个ID检查这条消息是否有被消费过,如果没有消费过,才更新数据,不然就将消费状态置为已消费。

相关文章:

怎么处理消息重发的问题?

消息队列在消息传递的过程中,如果出现传递失败的情况,发送方会重试,在重试的过程中,可能会产生重复的消息。 消息重复的情况必然存在 关于传递消息时能够提供的服务质量标准,MQTT协议给出了三种不同的标准&#xff1…...

JVM 运行时数据区(数据区组成表述,程序计数器,java虚拟机栈,本地方法栈)

JVM 运行时数据区JVM 运行时数据区3.1运行时的数据区组成概述3.1.1程度计数器3.1.2java虚拟机栈3.1.3本地方法栈3.1.4java堆3.1.5方法区3.2程序计数器3.3java虚拟机栈3.4本地方法栈JVM 运行时数据区 堆,方法区(元空间) 主要用来存放数据 是线程共享的. 程序计数器,本地方法栈…...

Oracle ASM磁盘组配置、日常运维、故障处理等操作资料汇总

ASM(自动存储管理)在数据库中是非常重要的组成部分,它可以为磁盘提供统一的存储管理、提高磁盘访问的性能和可用性、简化管理复杂度,从而为数据库的运行提供更好的支持。这里就为大家整理了墨天轮数据社区上一些ASM相关基础知识、…...

java对象的创建与内存分配机制

文章目录对象的创建与内存分配机制对象的创建类加载检查分配内存初始化零值设置对象头指向init方法其他:指针压缩对象内存分配对象在栈上分配对象在Eden区中分配大对象直接分配到老年代长期存活的对象进入老年代对象动态年龄判断老年代空间分配担保机制对象的内存回…...

本地存储localStorage、sessionStorage

目录 一、localStorage 二、sessionStorage 三、本地存储处理复杂数据 一、localStorage 介绍 (1)数据存储在用户浏览器中 (2)设置、读取方便、甚至页面刷新不会丢失数据 (3)容量较大,se…...

JavaSE: 网络编程

1.1 概述java程序员面对统一的网络编程环境B/S 架构 和 C/S架构1.2 网络通信的两个要素通信双方的地址:ip 端口号网络通信协议:TCP/IP协议(事实上的国际规则)、OSI模型(理想化)1.3 Inet Address本地回环地…...

计算机图形学09:二维观察之点的裁剪

作者:非妃是公主 专栏:《计算机图形学》 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、二维观察基本…...

2023Java 并发编程面试题

Java 并发编程 1、在 java 中守护线程和本地线程区别? java 中的线程分为两种:守护线程(Daemon)和用户线程(User)。任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(boolon…...

CAD如何绘制A0/A1/A2/A3/A4图框?

在CAD制图时,设计师一般会使用企业的定制图框模板或者个人的特色图框模板,让设计方案更加标准化、规范化。对于新人设计师而言,完成CAD制图已经非常头疼了,图框的绘制更是手忙脚乱。那么是否有更加高效的方式来完成A0、A1、A2、A3…...

R 安装 “umap-learn“ python 包

首先需要在R中下载并读取reticulate包,该包提供了一系列R-Python的交互式命令由于之前在电脑中通过三个方式安装了Python:直接安装 Python 3.10安装Anaconda,携带3.9安装 Miniconda,又是另外一个版本的Python版本各不相同&#xf…...

测试同学如何快速开发测试平台?

转眼已经好几个月没有发表什么文章了,因为疫情原因,大家工作都不怎么顺利,没有什么心情。再者,最近一直在搞移动端精准测试的项目,有太多技术难点需要攻克。从各个网站上都找不到解决方案,只能不断地尝试&a…...

【程序员接口百宝箱】免费常用API接口

一、短信发送 短信的应用可以说是非常的广泛了,短信API也是当下非常热门的API~ 短信验证码:可用于登录、注册、找回密码、支付认证等等应用场景。支持三大运营商,3秒可达,99.99%到达率,支持大容量高并发。…...

使数组和能被P整除[同余定理+同余定理变形]

同余定理同余定理变形前言一、使数组和能被P整除二、同余定理变形总结参考资料前言 同余定理非常经典,采用前缀和 map,当两个余数前缀和为一个值时,则中间一段子数组刚好对P整除。但是能否找到前面是否有一段子数组和可以对P整除呐&#xf…...

25k的Java开发常问的Synchronized问题有哪些?

前言:面试高频的Synchronized问题大多集中在应用场景、底层实现原理、锁的升级过程。 文章目录 Synchronized定义应用场景对象加锁实现原理JDK6以前JDK6版本及以后对象从无锁到偏向锁转化的过程(大概讲五分钟)轻量级锁升级的过程(大概讲五分钟)自旋锁策略(大概讲五分钟)…...

ES增量同步方案

1 基于业务代码嵌入式的增量同步方式在Java业务代码要修改业务数据的地方,增加调用写入ES数据的方法优点:1、实现方式简单,可控粒度高;2、不依赖第三方数据同步框架;3、数据库不用做特殊配置和部署;缺点&am…...

计算器--课后程序(Python程序开发案例教程-黑马程序员编著-第6章-课后作业)

实例1:计算器 计算器极大地提高了人们进行数字计算的效率与准确性,无论是超市的收银台,还是集市的小摊位,都能够看到计算器的身影。计算器最基本的功能是四则运算。本实例要求编写程序,实现计算器的四则运算功能。 实…...

YOLOv5中添加SE模块详解——原理+代码

目录一、SENet1. 设计原理2. SE Block2.1 Squeeze:Global Information Embedding2.2 Excitation:Adaptive Recalibration3. SE-Inception and SE-ResNet二、YOLOv5中添加SENet1.修改common.py2.修改yolo.py3.修改yolov5s.yaml参考文章一、SENet 论文地址:Squeeze-a…...

arcgispro3.1(账号登陆)

ArcGIS Pro 3.1 更新中文概览专注于 制图、GIS、Python前言:本次更新给了我两个惊喜,一个是本来 ArcMap 就有的功能,另一个明显是学习的 QGIS,嘿嘿,大家往下看吧。整理翻译了一下官方的 ArcGIS Pro 3.1 新特性更新概览…...

VB6换个思路解决微信下载文件只读的问题(含源码)

日期:2023年3月10日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方&#xf…...

Allegro如何知道组合操作命令的拼写

Allegro如何知道组合操作命令的拼写 前面介绍了如何知道单个操作命令的拼写,但如果是复合命令,就无法直观的通过命令来了解,如下图 Snap Pick to -Segment这个命令拼写是什么 如何知道,具体操作如下 点击File点击Script 出现Scripting窗口...

利用Taotoken为AIGC内容生成平台提供稳定模型供应链

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 利用Taotoken为AIGC内容生成平台提供稳定模型供应链 对于AIGC内容生成平台而言,其核心价值在于为用户提供稳定、多样且…...

【数据分析】基于matlab智慧城市温度与湿度分析系统【含Matlab源码 15555期】

💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞&#x1f49…...

《元创力》纪实录·卷宗2.1对话态对位法的预习:在“审查通过”与“舆论倒查”之间

叙事背景:最近关于姚晨因《监狱来的妈妈》在国际获奖而微博发声评论引发广泛关注和讨论,由于媒体出现一份判决文书,群众发现《监狱来的妈妈》电影的叙事内容与判决文书不符,引发了舆论声讨,姚晨被迫道歉,删…...

【算法分析与设计】第4篇:分治策略的理论框架与经典案例

在计算机科学中,很少有比“分而治之”更自然的解题思路了。面对一个庞杂的问题,先把它切成几个小块,逐个击破,再拼回整体——这种朴素的分割策略,经过严谨的形式化之后,便成了我们所说的分治范式。一个标准…...

EASY-HWID-SPOOFER:3步掌握硬件标识伪装技术,保护数字隐私安全

EASY-HWID-SPOOFER:3步掌握硬件标识伪装技术,保护数字隐私安全 【免费下载链接】EASY-HWID-SPOOFER 基于内核模式的硬件信息欺骗工具 项目地址: https://gitcode.com/gh_mirrors/ea/EASY-HWID-SPOOFER 在当今数字时代,硬件标识&#x…...

DeepSeek微调吞吐量翻倍实践:LoRA+梯度检查点+FlashAttention-3三重协同调优(附A100/A800实测QPS对比表)

更多请点击: https://codechina.net 第一章:DeepSeek性能调优指南 DeepSeek系列大模型在推理与训练阶段的性能表现高度依赖于硬件适配、计算图优化及内存管理策略。本章聚焦于可落地的调优实践,涵盖推理加速、显存压缩与计算精度协同配置三大…...

GetQzonehistory:免费永久保存QQ空间说说的终极解决方案

GetQzonehistory:免费永久保存QQ空间说说的终极解决方案 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾担心QQ空间里那些珍贵的青春记忆会随着时间流逝而消失&…...

终极Enigma Virtual Box解包指南:evbunpack完全解析与实战应用

终极Enigma Virtual Box解包指南:evbunpack完全解析与实战应用 【免费下载链接】evbunpack Enigma Virtual Box Unpacker / 解包、脱壳工具 项目地址: https://gitcode.com/gh_mirrors/ev/evbunpack Enigma Virtual Box解包工具evbunpack是一个专门用于解包E…...

工作总“救火”还费力不讨好?《易经》这一卦告诉你:别瞎忙

你有没有遇到过这样的同事或领导?哪里出问题,他就冲向哪里,整天忙得脚不沾地,可最后不但没解决问题,反而把局面弄得更糟,自己也落得个“吃力不讨好”。或者,你自己就是那个“救火队员”。项目出…...

5分钟终极指南:如何用KMS_VL_ALL_AIO一键搞定Windows和Office激活难题

5分钟终极指南:如何用KMS_VL_ALL_AIO一键搞定Windows和Office激活难题 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows激活烦恼吗?每次重装系统后都要到处寻…...