【Java-多线程】什么是幂等性?

以下是关于幂等性的详细解析:

一、幂等性定义

幂等性(Idempotence) 是指同一操作多次执行所产生的影响与一次执行的效果相同。就像数学中的乘法运算:1×1×1=1,无论乘多少次结果都不变。

二、生活化案例

外卖订单场景

  1. 用户点击"支付"按钮时网络抖动
  2. 支付系统收到两次相同支付请求
  3. 如果接口没有幂等性:可能扣除双倍金额
  4. 具备幂等性的系统:即使收到多次请求,只扣款一次

三、技术实现方案

1. 数据库唯一约束
CREATE TABLE orders (
    id VARCHAR(32) PRIMARY KEY, -- 唯一订单号
    amount DECIMAL(10,2),
    status ENUM('CREATED','PAID')
);
2. 版本号控制
// 更新账户余额时附带版本号
UPDATE accounts 
SET balance = balance - 100, version = version + 1 
WHERE id = 123 AND version = 5;
3. Token机制实现流程
用户 服务端 Redis 数据库 请求获取token 生成唯一token(有效期5分钟) 返回token 提交请求(携带token) 检查token是否存在 删除token 执行业务操作 拒绝重复请求 alt [token存在] [token不存在] 用户 服务端 Redis 数据库

四、HTTP方法幂等性对照表

方法 是否幂等 示例
GET ✔️ 查询用户信息
PUT ✔️ 更新用户资料
DELETE ✔️ 删除订单记录
POST 创建新的支付订单
PATCH 部分更新商品库存

五、分布式系统实践

雪花算法生成唯一ID

public class SnowflakeIdWorker {
    // 41位时间戳 | 10位机器ID | 12位序列号
    public synchronized long nextId() {
        long timestamp = timeGen();
        if (timestamp < lastTimestamp) {
            throw new RuntimeException("时钟回拨");
        }
        if (lastTimestamp == timestamp) {
            sequence = (sequence + 1) & sequenceMask;
            if (sequence == 0) {
                timestamp = tilNextMillis(lastTimestamp);
            }
        } else {
            sequence = 0L;
        }
        lastTimestamp = timestamp;
        return ((timestamp - twepoch) << timestampLeftShift)
                | (datacenterId << datacenterIdShift)
                | (workerId << workerIdShift)
                | sequence;
    }
}

六、典型应用场景

  1. 支付系统重复扣款防护
  2. 消息队列的重复消费处理(如RocketMQ的Exactly-Once语义)
  3. 微服务调用重试机制
  4. 文件上传的断点续传功能
  5. 分布式锁的自动续期机制

七、常见误区

  1. 所有接口都要幂等 → 应根据业务需求设计(如日志记录可不要求)
  2. 前端控制足够 → 必须服务端实现最终保障
  3. 仅考虑同步调用 → 异步消息场景更需要幂等性
  4. 忽略网络分区情况 → 需考虑CAP理论中的各种边界条件

八、总结

核心价值:在不可靠的网络环境中构建可靠系统
设计原则

  1. 唯一标识识别重复请求
  2. 前置状态检查避免重复处理
  3. 后置补偿机制兜底保障

【Java-多线程】什么是幂等性?_第1张图片

你可能感兴趣的:(【Java-多线程】什么是幂等性?)