简单聊一聊幂等和防重

news2024/9/25 1:21:21

大家好,我是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.coloradmin.cn/o/1227954.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

integrin + Receptor ; platelet ; Ig-CAM

platelet HPA ; integrin ; Cell adhesion in cancer: Beyond the migration of single cells

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

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

用GPT 搭建一个占星术、解梦、塔罗牌占卜和命理学服务

今天来尝试我们的占星术、解梦、塔罗牌占卜和命理学服务&#xff0c;揭开宇宙的奥秘并获得自我认识 聊天 GPT API 集成的 HTML5 模板。我们的目标是提供易于使用且高度可定制的 API 代码&#xff0c;使您能够训练自己的人工智能解决方案并将其添加到提示中。 我们的产品是可定…

JSP命令标签 静态包含/动态包含

好 下面我们聊聊JSP中的指令标签 这边 我们来说两个 分别是 静态包含 和 动态包含 我们可以将重用性代码包含起来 更好的使用 比如 我们界面上中下 分别有三个导航栏 那么 如果你写三份 就会出现很多重复代码 而且 改起来 也很不方便 要一次改三份 口说无凭 我们来做一个小案…

【Linux】第十九站:进程替换

文章目录 一、单进程版---最简单的程序替换二、进程替换的原理三、多进程的程序替换1.多进程的程序替换实例2.那么程序在替换时候有没有创建子进程呢3.再谈原理4.一个现象5.我们的CPU如何得知程序的入口地址&#xff1f; 四、各个接口的介绍1.execl2.execlp3.execv4.execvp5.ex…

【机器学习13】生成对抗网络

1 GANs的基本思想和训练过程 生成器用于合成“假”样本&#xff0c; 判别器用于判断输入的样本是真实的还是合成的。 生成器从先验分布中采得随机信号&#xff0c;经过神经网络的变换&#xff0c; 得到模拟样本&#xff1b; 判别器既接收来自生成器的模拟样本&#xff0c; 也接…

基于一致性算法的微电网分布式控制MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 本模型主要是基于一致性理论的自适应虚拟阻抗、二次电压补偿以及二次频率补偿&#xff0c;实现功率均分&#xff0c;保证电压以及频率稳定性。 一致性算法 分布式一致性控制主要分为两类&#xff1a;协调同…

Linux管道的工作过程

常用的匿名管道&#xff08;Anonymous Pipes&#xff09;&#xff0c;也即将多个命令串起来的竖线。管道的创建&#xff0c;需要通过下面这个系统调用。 int pipe(int fd[2]) 我们创建了一个管道 pipe&#xff0c;返回了两个文件描述符&#xff0c;这表示管道的两端&#xff…

『Spring Boot Actuator Spring Boot Admin』 实现应用监控管理

前言 本文将会使用 Spring Boot Actuator 组件实现应用监视和管理&#xff0c;同时结合 Spring Boot Admin 对 Actuator 中的信息进行界面化展示&#xff0c;监控应用的健康状况&#xff0c;提供实时警报功能 Spring Boot Actuator 简介 官方文档&#xff1a;Production-rea…

RocketMQ(三):集成SpringBoot

RocketMQ系列文章 RocketMQ(一)&#xff1a;基本概念和环境搭建 RocketMQ(二)&#xff1a;原生API快速入门 RocketMQ(三)&#xff1a;集成SpringBoot 目录 一、搭建环境二、不同类型消息1、同步消息2、异步消息3、单向消息4、延迟消息5、顺序消息6、带tag消息7、带key消息 一…

【IPC】 共享内存

1、概述 共享内存允许两个或者多个进程共享给定的存储区域。 共享内存的特点 1、 共享内存是进程间共享数据的一种最快的方法。 一个进程向共享的内存区域写入了数据&#xff0c;共享这个内存区域的所有进程就可以立刻看到 其中的内容。 2、使用共享内存要注意的是多个进程…

如何定位el-tree中的树节点当父元素滚动时如何定位子元素

使用到的方法 Element 接口的 scrollIntoView() 方法会滚动元素的父容器&#xff0c;使被调用 scrollIntoView() 的元素对用户可见。 参数 alignToTop可选 一个布尔值&#xff1a; 如果为 true&#xff0c;元素的顶端将和其所在滚动区的可视区域的顶端对齐。相应的 scrollIntoV…

C语言入门笔记—static、extern、define、指针、结构体

一、static static修饰局部变量的时候&#xff0c;局部变量出了作用域&#xff0c;不销毁。本质上&#xff0c;static修饰局部变量的时候&#xff0c;改变了变量的存储位置。详见下图&#xff0c;当a不被static修饰和被static修饰的时候。 C/C static关键字详解&#xff…

随机过程-张灏

文章目录 导论随机过程相关 学习视频来源&#xff1a;https://www.bilibili.com/video/BV18p4y1u7NP?p1&vd_source5e8340c2f2373cdec3870278aedd8ca4 将持续更新—— 第一次更新&#xff1a;2023-11-19 导论 教材&#xff1a;《随机过程及其应用》陆大絟.张颢 参考&…

CD36 ; + Lectin;

CD2 LIMP-2&#xff0c; LGP85 SR-BI&#xff0c; CD36&#xff1b; 清道夫受体蛋白CD36超家族的成员是 脂质代谢 和 先天免疫 的重要调节因子。它们识别正常和修饰的脂蛋白&#xff0c;以及与病原体相关的分子模式。 该家族由三个成员组成&#xff1a; SR-BI &am…

ZJU Beamer学习手册(二)

ZJU Beamer学习手册基于 Overleaf 的 ZJU Beamer模板 进行解读&#xff0c;本文则基于该模版进行进一步修改。 参考文献 首先在frame文件夹中增加reference.tex文件&#xff0c;文件内容如下。这段代码对参考文献的引用进行了预处理。 \usepackage[backendbiber]{biblatex} \…

异常语法详解

异常语法详解 一&#xff1a;异常的分类&#xff1a;二&#xff1a;异常的处理1:异常的抛出:throw2&#xff1a;异常的声明:throws3&#xff1a;try-catch捕获并处理异常 三&#xff1a;finally关键字四&#xff1a;自定义异常类&#xff1a; 一&#xff1a;异常的分类&#xf…

电路的基本原理

文章目录 一、算数逻辑单元(ALU)1、功能2、组成 二、电路基本知识1、逻辑运算2、复合逻辑 三、加法器实现1、一位加法器2、串行加法器3、并行加法器 一、算数逻辑单元(ALU) 1、功能 算术运算&#xff1a;加、减、乘、除等 逻辑运算&#xff1a;与、或、非、异或等 辅助功能&am…

对vb.net 打印条形码code39、code128A、code128C、code128Auto(picturebox和打印机)封装类一文的补充

在【精选】vb.net 打印条形码code39、code128A、code128C、code128Auto&#xff08;picturebox和打印机&#xff09;封装类_vb.net打印标签_WormJan的博客-CSDN博客 这篇文章中&#xff0c;没有对含有字母的编码进行处理。这里另开一篇帖子&#xff0c;处理这种情况。 在那篇文…

【C++入门】拷贝构造运算符重载

目录 1. 拷贝构造函数 1.1 概念 1.2 特征 1.3 常用场景 2. 赋值运算符重载 2.1 运算符重载 2.2 特征 2.3 赋值运算符 前言 拷贝构造和运算符重载是面向对象编程中至关重要的部分&#xff0c;它们C编程中的一个核心领域&#xff0c;本期我详细的介绍拷贝构造和运算符重载。 1. …