接口幂等性设计

什么叫接口幂等性

系统中一个接口运行多次和运行一次的效果是一样的, 防止重复操作
比如, 多次点击提交订单按钮, 后台只生成一条订单; 支付时, 由于网络问题重发,应该只扣一次钱

删除业务的幂等性

先查询, 有再删除

    public int delUser(Integer userId) {
        User user = userMapper.selectByPrimaryKey(userId);
        if (user!=null){
            log.info("用户存在,用户为:"+userId);
            return userMapper.deleteByPrimaryKey(userId);
        }
        log.info("用户不存在存在,用户为:"+userId);
        return 0;
    }

更新业务的幂等性

加一个版本号version字段, 每次修改都+1, 并且每次修改都需要带上version字段作为条件
在这里插入图片描述

插入业务的幂等性

使用分布式锁
依赖

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.14</version>
        </dependency>

定义ZkConfig

@Configuration
public class ZkConfig {

    @Bean(initMethod="start",destroyMethod = "close")
    public CuratorFramework getCuratorFramework() {
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
        CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2181", retryPolicy);
        return client;
    }
}

插入保证幂等性

@Service
@Slf4j
public class UserService {
    @Resource
    private UserMapper userMapper;
    @Autowired
    private CuratorFramework zkClient;

    public int insertUser(User user, String token) throws Exception {
        InterProcessMutex lock = new InterProcessMutex(zkClient, "/"+token);
        boolean isLock = lock.acquire(30, TimeUnit.SECONDS);
        if (isLock){
            return userMapper.insertSelective(user);
        }
        return 0;
    }
}

这种使用分布式锁结合token保证幂等性, 适用于所有场景

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sunny_yiyi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值