简单聊一聊幂等和防重

大家好,我是G探险者。

每年的双十一,618,电商系统都会面临这超高的流量,如果一个订单被反复提交,那电商系统如何保证这个订单之后执行一次减库存,扣款的操作?

这里就引入两个概念,幂等和防重。

幂等(Idempotence)和防重(Idempotency in data handling or Anti-replay)是两个在计算机科学和数据处理中经常遇到的概念,尤其在分布式系统、网络通信和数据库操作中非常重要。

今天我们就来聊聊二者的区别在哪里

1. 幂等 (Idempotence)

1.1 定义

一个操作是幂等的,意味着无论这个操作执行多少次,结果都是一样的。换句话说,执行一次和多次对系统的影响是相同的。

1.2 应用场景
  • 网络通信:避免网络不稳定导致的重复请求改变结果,如HTTP的GET请求。
  • 分布式系统:保持系统状态一致,特别是在组件间通信不确定的情况下。
  • 数据库事务:确保重复执行的SQL语句不改变数据库状态。
  • 支付和金融交易:防止因重复操作导致的财务错误,如重复支付处理。
  • 订单处理系统:避免重复订单或不一致的订单状态。
  • 任务或作业调度:确保重复执行任务不产生副作用。
1.3 实现思路
  • 使用唯一事务标识符。
  • 状态检查,避免重复执行相同状态的操作。
  • 乐观锁或其他并发控制机制。
1.4 示例代码
public class BankAccount {private double balance;public BankAccount(double balance) {this.balance = balance;}// 幂等的存款方法public void deposit(double amount, String transactionId) {if (!isTransactionProcessed(transactionId)) {balance += amount;markTransactionAsProcessed(transactionId);}}private boolean isTransactionProcessed(String transactionId) {// 实现检查逻辑return false;}private void markTransactionAsProcessed(String transactionId) {// 实现标记逻辑}
}

2. 防重 (Anti-replay or Idempotency in Data Handling)

2.1 定义

防重处理是确保不会重复处理相同的数据或请求的方法,用于避免由于重复执行相同操作而产生的数据错误或资源浪费。

2.2 应用场景
  • 网络安全:防止重放攻击,保护API免受重复请求攻击。
  • 金融服务和支付系统:防止重复交易和错误的资金扣除。
  • 电子商务:避免重复下单和库存数据不一致。
  • 消息队列和分布式系统:确保消息不被重复处理,防止数据同步错误。
  • Web服务和API:避免重复表单提交和REST API的重复请求。
  • 身份验证和授权:管理Session和防止重复使用认证信息。
2.3 实现思路
  • 为每个请求或操作分配唯一标识符。
  • 跟踪和存储请求的状态,避免重复处理。
  • 结合速率限制、请求去重和缓存机制。
2.4 示例代码
import java.util.HashSet;
import java.util.Set;public class RequestHandler {private Set<String> processedRequests = new HashSet<>();public void handleRequest(String requestId) {if (!processedRequests.contains(requestId)) {process(requestId);processedRequests.add(requestId);} else {// 已处理的请求}}private void process(String requestId) {// 实现请求处理逻辑}
}

3. 对比分析

特性幂等 (Idempotence)防重 (Anti-replay)
定义无论执行多少次,操作的结果都相同。防止重复处理相同的请求或数据。
目的保证重复执行操作不会改变结果。防止由于重复请求造成的数据错误或资源浪费。
应用场景分布式系统、网络通信、数据库操作网络安全、金融交易、数据同步
关键点结果一致性请求或数据的唯一性
实现方式通过确保操作本身的特性(如GET请求)或通过系统设计来保证通过跟踪唯一标识符(如时间戳、序列号等)来避免重复处理
举例HTTP GET请求,数学中的绝对值操作SSL/TLS协议中的重放攻击防御,金融交易的唯一性验证
挑战设计能够在各种情况下保持结果一致性的操作有效地识别和管理重复的请求或数据
侧重操作的一致性和可预测性数据和请求的安全性和完整性

4. 小结

两者都涉及处理重复的操作或请求,且都旨在保证系统的一致性和稳定性。
区别:幂等关注的是操作执行多次的结果不变,而防重侧重于识别和防止重复处理相同的请求或数据。
联系:在实际应用中,幂等性常常是实现防重策略的一部分,尤其是在分布式系统和网络通信中。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux进程】进程等待 与 进程替换 原理与函数使用

文章目录 一、进程等待1.1 意义 / 必要性1.2 进程等待的函数&#xff08;wait / waitpid&#xff09;1.3 status参数1.4 获取子进程status1.5 进程的阻塞等待与非阻塞等待 二、进程替换2.1 引言2.2 进程替换原理2.3 替换函数 一、进程等待 1.1 意义 / 必要性 为什么要有进程等…

【C++】泛型编程 ⑦ ( 模板类常用用法 | 模板类声明 | 模板类调用 | 模板类作为函数参数 )

文章目录 一、类模板基础用法1、类模板声明定义2、类模板使用3、类模板做函数参数 二、完整代码示例1、代码示例2、执行结果 一、类模板基础用法 1、类模板声明定义 上一篇博客中 , 【C】泛型编程 ⑥ ( 类模板 | 类模板语法 | 代码示例 ) 讲解了模板类的基础语法 , 模板类声明如…

从一到无穷大 #19 TagTree,倒排索引入手是否是优化时序数据库查询的通用方案?

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 文章主旨时序数据库查询的一般流程扫描维度聚合时间聚合管控语句 TagTree整体结构索引…

SQL零基础入门教程,贼拉详细!贼拉简单! 速通数据库期末考!(十)

SQL 函数 SQL 拥有很多可用于计数和计算的内建函数。 比如&#xff1a; AVG() - 返回平均值 COUNT() - 返回行数 MAX() - 返回最大值 MIN() - 返回最小值 SUM() - 返回总和 FIRST() - 返回第一个记录的值 LAST() - 返回最后一个记录的值 GROUP BY 学习SQL函数前&#xff0c…

【数据结构&C++】二叉平衡搜索树-AVL树(25)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.AVL树的概念二.AVL树节点的定义(代码…

Unity2021及以上 启动或者禁用自动刷新

Unity 2021以以上启动自动刷新 Edit---> Preferences--> Asset Pipline --> Auto Refresh 禁用的结果 如果不启动自动刷新在Project面板选择Refresh是不会刷新已经修改后的脚本的。

C++之常用算法

C之常用算法 for_each transform #include<iostream> using namespace std; #include<vector> #include<algorithm>class Tranfor { public:int operator()(int var){return var;} };class MyPrint { public:void operator()(int var){cout << var&l…

23.11.19日总结

经过昨天的中期答辩&#xff0c;其实可以看出来项目进度太慢了&#xff0c;现在是第十周&#xff0c;预计第十四周是终级答辩&#xff0c;在这段时间要把项目写完。 前端要加上一个未登录的拦截器&#xff0c;后端加上全局的异常处理。对于饿了么项目的商品建表&#xff0c;之前…

面向对象与面向过程的区别

面向对象 以对象为中心&#xff0c;把数据封装成为一个整体&#xff0c;其他数据无法直接修改它的数据&#xff0c;将问题分解成不同对象&#xff0c;然后给予对象相应的属性和行为。 面向过程 关注代码过程&#xff0c;直接一程序来处理数据&#xff0c;各模块之间有调用与…

mybatis使用xml形式配置

以这个注解形式的查询代码为例 Select("select * from emp where name like concat(%,#{name},%) and gender #{gender} and entrydate between #{begin} and #{end} order by update_time desc ")public List<Emp> list(String name, Short gender, LocalDat…

Unity中Shader法线贴图(上)

文章目录 前言一、法线纹理的作用二、为什么法线贴图长这样&#xff1f;&#xff08;蓝色&#xff09;三、法线贴图能使纹理采样时&#xff0c;进行偏移采样四、在Shader中使用法线贴图1、在属性面板定义一个变量来接收法线贴图2、在使用前声明 _NormalTex3、在片元着色器中&am…

【ATTCK】MITRE Caldera-路径发现插件

CALDERA是一个由python语言编写的红蓝对抗工具&#xff08;攻击模拟工具&#xff09;。它是MITRE公司发起的一个研究项目&#xff0c;该工具的攻击流程是建立在ATT&CK攻击行为模型和知识库之上的&#xff0c;能够较真实地APT攻击行为模式。 通过CALDERA工具&#xff0c;安全…