优雅地处理重复请求并发请求

来源:jaskey.github.io/blog//05/

19/handle-duplicate-request/

对于一些用户请求,在某些情况下是可能重复发送的,如果是查询类操作并无大碍,但其中有些是涉及写入操作的,一旦重复了,可能会导致很严重的后果,例如交易的接口如果重复请求可能会重复下单。

重复的场景有可能是:

黑客拦截了请求,重放前端/客户端因为某些原因请求重复发送了,或者用户在很短的时间内重复点击了。网关重发….

本文讨论的是如何在服务端优雅地统一处理这种情况,如何禁止用户重复点击等客户端操作不在本文的讨论范畴。

利用唯一请求编号去重

你可能会想到的是,只要请求有唯一的请求编号,那么就能借用Redis做这个去重——只要这个唯一请求编号在redis存在,证明处理过,那么就认为是重复的

代码大概如下:

StringKEY="REQ";//请求唯一编号longexpireTime=;//毫秒过期,ms内的重复请求会认为重复longexpireAt=System.currentTimeMillis()+expireTime;Stringval="expireAt

"+expireAt;//rediskey还存在的话要就认为请求是重复的BooleanfirstSet=stringRedisTemplate.execute((RedisCallbackBoolean)connection-connection.set(KEY.getBytes(),val.getBytes(),Expiration.milliseconds(expireTime),RedisStringCommands.SetOption.SET_IF_ABSENT));finalbooleanisConsiderDup;if(firstSet!=nullfirstSet){//第一次访问isConsiderDup=false;}else{//redis值已存在,认为是重复了isConsiderDup=true;}

基于SpringBoot+MyBatisPlus+VueElement实现的后台管理系统+用户小程序,支持RBAC动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能。

项目


转载请注明:http://www.jiaju1314.com/zyyd/zyyd/15953.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了