赞
踩
大家好,我是G探险者。
每年的双十一,618,电商系统都会面临这超高的流量,如果一个订单被反复提交,那电商系统如何保证这个订单之后执行一次减库存,扣款的操作?
这里就引入两个概念,幂等和防重。
幂等(Idempotence)和防重(Idempotency in data handling or Anti-replay)是两个在计算机科学和数据处理中经常遇到的概念,尤其在分布式系统、网络通信和数据库操作中非常重要。
今天我们就来聊聊二者的区别在哪里
一个操作是幂等的,意味着无论这个操作执行多少次,结果都是一样的。换句话说,执行一次和多次对系统的影响是相同的。
- 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) {
- // 实现标记逻辑
- }
- }
防重处理是确保不会重复处理相同的数据或请求的方法,用于避免由于重复执行相同操作而产生的数据错误或资源浪费。
- 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) {
- // 实现请求处理逻辑
- }
- }
特性 | 幂等 (Idempotence) | 防重 (Anti-replay) |
---|---|---|
定义 | 无论执行多少次,操作的结果都相同。 | 防止重复处理相同的请求或数据。 |
目的 | 保证重复执行操作不会改变结果。 | 防止由于重复请求造成的数据错误或资源浪费。 |
应用场景 | 分布式系统、网络通信、数据库操作 | 网络安全、金融交易、数据同步 |
关键点 | 结果一致性 | 请求或数据的唯一性 |
实现方式 | 通过确保操作本身的特性(如GET请求)或通过系统设计来保证 | 通过跟踪唯一标识符(如时间戳、序列号等)来避免重复处理 |
举例 | HTTP GET请求,数学中的绝对值操作 | SSL/TLS协议中的重放攻击防御,金融交易的唯一性验证 |
挑战 | 设计能够在各种情况下保持结果一致性的操作 | 有效地识别和管理重复的请求或数据 |
侧重 | 操作的一致性和可预测性 | 数据和请求的安全性和完整性 |
两者都涉及处理重复的操作或请求,且都旨在保证系统的一致性和稳定性。
区别:幂等关注的是操作执行多次的结果不变,而防重侧重于识别和防止重复处理相同的请求或数据。
联系:在实际应用中,幂等性常常是实现防重策略的一部分,尤其是在分布式系统和网络通信中。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。