所谓请求序列号,其实就是每次向服务端请求时候附带一个短时间内唯一不重复的序列号,该序列号可以是一个有序 ID
,也可以是一个订单号,一般由下游生成,在调用上游服务端接口时附加该序列号和用于认证的 ID
。
当上游服务器收到请求信息后拿取该 序列号 和下游 认证ID 进行组合,形成用于操作 Redis 的 Key
,然后到 Redis 中查询是否存在对应的 Key
的键值对,根据其结果:
- 如果存在,就说明已经对该下游的该序列号的请求进行了业务处理,这时可以直接响应重复请求的错误信息。
- 如果不存在,就以该
Key
作为 Redis 的键,以下游关键信息作为存储的值(例如下游商传递的一些业务逻辑信息),将该键值对存储到 Redis 中 ,然后再正常执行对应的业务逻辑即可。
适用操作
- 插入操作
- 更新操作
- 删除操作
使用限制
- 要求第三方传递唯一序列号;
- 需要使用第三方组件 Redis 进行数据效验;
- 下游服务生成分布式
ID
作为序列号,然后执行请求调用上游接口,并附带唯一序列号与请求的认证凭据ID。 - 上游服务进行安全效验,检测下游传递的参数中是否存在序列号和凭据ID。
- 上游服务到 Redis 中检测是否存在对应的序列号与认证ID组成的
Key
,如果存在就抛出重复执行的异常信息,然后响应下游对应的错误信息。如果不存在就以该序列号和认证ID组合作为Key
,以下游关键信息作为Value
,进而存储到 Redis 中,然后正常执行接来来的业务逻辑。
“ 上面步骤中插入数据到 Redis 一定要设置过期时间。这样能保证在这个时间范围内,如果重复调用接口,则能够进行判断识别。如果不设置过期时间,很可能导致数据无限量的存入 Redis,致使 Redis 不能正常工作。