微服务篇之接口幂等性

一、幂等接口

幂等 : 多次调用方法或者接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致。

基于RESTful API的角度对部分常见类型请求的幂等性特点进行分析:

解决方案如下。

二、token+redis

三、分布式锁

1. 快速失败(抢不到锁的线程)。

2. 控制锁的粒度。

java 复制代码
public void saveOrder(Item item) throws InterruptedException {
        //获取锁(重入锁),执行锁的名称
        RLock lock = redissonClient.getLock("yourNameLock");
        //尝试获取锁,参数分别是:获取锁的最大等待时间(期间会重试),锁自动释放时间,时间单位
        boolean isLock = lock.tryLock(10, TimeUnit.SECONDS);
        try {        //判断是否获取成功
            if (!isLock) {
                log.info("下单操作获取锁失败,order:{}", item);
                throw new RuntimeException("新增或修改失败");
            }
            //下单操作
        } finally {
            // 释放锁
            lock.unlock();
        }
    }

四、面试题

**面试官:**分布式服务的接口幂等性如何设计?

**候选人:**我们当时有一个xx项目的下单操作,采用的token+redis实现的,流程是这样的:

第一次请求,也就是用户打开了商品详情页面,我们会发起一个请求,在后台生成一个唯一token存入redis,key就是用户的id,value就是这个token,同时把这个token返回前端。

第二次请求,当用户点击了下单操作会后,会携带之前的token,后台先到redis进行验证,如果存在token,可以执行业务,同时删除token;如果不存在,则直接返回,不处理业务,就保证了同一个token只处理一次业务,就保证了幂等性。

相关推荐
七星静香15 分钟前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel
W Y15 分钟前
【架构-37】Spark和Flink
架构·flink·spark
Jacob程序员16 分钟前
java导出word文件(手绘)
java·开发语言·word
ZHOUPUYU17 分钟前
IntelliJ IDEA超详细下载安装教程(附安装包)
java·ide·intellij-idea
stewie620 分钟前
在IDEA中使用Git
java·git
Elaine20239135 分钟前
06 网络编程基础
java·网络
Gemini199536 分钟前
分布式和微服务的区别
分布式·微服务·架构
G丶AEOM37 分钟前
分布式——BASE理论
java·分布式·八股
落落鱼201337 分钟前
tp接口 入口文件 500 错误原因
java·开发语言
想要打 Acm 的小周同学呀38 分钟前
LRU缓存算法
java·算法·缓存