当前位置:   article > 正文

简单聊一聊幂等和防重

简单聊一聊幂等和防重

大家好,我是G探险者。

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

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

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

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

1. 幂等 (Idempotence)

1.1 定义

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

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

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

2.1 定义

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

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

3. 对比分析

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

4. 小结

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/234761
推荐阅读
相关标签
  

闽ICP备14008679号