接口防刷 && 接口幂等性问题

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 接口防刷 && 接口幂等性问题

概念

接口幂等性是指用户对于同一操作发起的一次请求和多次请求的结果是一致的,不会因为多次点击而产生副作用。

场景:假如用户进行下单操作的时候多次点击如果不能保证接口的幂等性就会提交多次订单请求,或者微服务之间当订单服务调用库存服务的时候如果出现了调用异常,那么我们并不知道是库存已经减了之后发生的异常还是由于网络原因库存还没减发生的异常。

哪些情况需要防止

  • 用户多次点击
  • 用户页面退回再提交
  • 微服务互相调用,由于网络问题导致请求失败,Feign触发重试机制

接口幂等性的解决方法

接口幂等性是指用户因为网络或者恶意多次请求接口导致数据的重复提交产生的问题,所以接口要保证幂等性,比如在用户在下订单的时候即使重复点击结算按钮也只能给服务器提交一次结算请求。

解决方法:当用户访问该提交页面的时候就生成一个令牌给用户并且将这个令牌保存在redis或者mysql中,之后用户在这个页面提交的数据必须携带这个令牌,后端接收到用户的请求拿着令牌与redis中的令牌做对比,如果存在那么就开始执行相应的逻辑并且删除该令牌,之后再执行响应的逻辑,否则就快速响应结束请求。那么需要注意的是,令牌的对比和删除要保证原子性,所以我们采用redis的lua脚本的方式来解决这个问题。

String orderToken = orderSubmitVo.getOrderToken();
        String key = OrderConstant.USER_ORDER_TOKEN_PREFIX + userId;
        //验证令牌
        String script = "if redis.call('get', KEYS[1]) == ARGV[1] " +
                "then return redis.call('del', KEYS[1]) else return 0 end";
        Long result = stringRedisTemplate.execute(new DefaultRedisScript<Long>(script, Long.class),
                Arrays.asList(key), orderToken);
        if (result == 0L){
            //令牌验证失败
            response.setCode(1);
            return response;
        }else {
            //令牌验证成功
            }
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6月前
接口幂等性设计
接口幂等性设计
71 1
|
前端开发 NoSQL JavaScript
常见接口和服务幂等性问题及解决方案
常见接口和服务幂等性问题及解决方案
402 0
|
6月前
|
存储 缓存 安全
接口的幂等性
接口的幂等性
71 0
|
1月前
|
数据库
什么是接口幂等性?如何保证接口幂等性?
接口幂等性(Idempotency)是指同样的请求被重复执行多次,产生的结果与执行一次的结果相同。换句话说,接口无论被调用一次还是多次,系统的最终状态保持不变。
105 5
|
3月前
|
缓存 NoSQL Java
接口幂等该如何设计和实现
本文探讨了程序开发中常见的重复操作问题,如多次点击生成多余订单或支付、RPC调用失败后的重试机制滥用及非法重复请求等。通过接口幂等性设计可有效解决这类问题,确保相同请求多次执行结果一致无副作用。文章详细解释了幂等性的概念及其重要性,并提供了具体的设计与实现方法,包括使用唯一标识符、设计幂等操作、事务处理及缓存策略。此外,还讨论了实现幂等性接口所带来的好处,如并发请求处理、失败请求管理及系统集成等,并提出了验证接口幂等性的策略。通过这些技术和方法的应用,可以显著提升系统的稳定性和用户体验。
|
5月前
|
数据库 API 网络架构
浅谈应用接口的幂等性
【6月更文挑战第2天】本文介绍幂等性是计算和网络通信中的重要概念,确保同一操作执行多次不会改变结果。在数据库操作中,查询、删除(同一数据)和特定更新是幂等的,而插入和累加更新不是。幂等性和安全性(如GET、HEAD等方法)确保多次请求无副作用,对涉及金钱的操作尤为重要。
73 0
|
6月前
|
数据采集 存储 NoSQL
如何优雅实现接口防刷
一文讲清楚如何用redis实现接口防刷
76 0
如何优雅实现接口防刷
|
6月前
|
存储 缓存 数据库
接口幂等有哪些实现方式
接口幂等有哪些实现方式
43 0
|
6月前
|
API
什么是接口幂等
什么是接口幂等
184 0
|
消息中间件 SpringCloudAlibaba NoSQL
接口幂等性解决方案
**幂等性**原本是数学上的概念,即使公式:f(x)=f(f(x)) 能够成立的数学性质。用在编程领域,则意为对同一个系统,使用同样的条件,一次请求和重复的多次请求对系统资源的影响是一致的。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。
621 0
接口幂等性解决方案