幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数
研究了很久的幂等性解决方案。终于实现了一个模型。抛砖引玉,希望各路大神指正
1、主要是基于Spring MVC的HandlerInterceptorAdapter + ResponseBodyAdvice + redis的分布式锁。
2、幂等的请求。需要在请求中加入header参数X-REQ-IDEM-ID,并赋值UUID,用于标记同一次请求
3、如果同一请求发生竞争。通过redis的nx来竞争锁。竞争失败的请求返回状态码499
4、如果请求时,当前UUID状态正在处理中,那么返回499
5、客户端收到reponse code 为 499。则需要通过重试策略来获得执行结束后的值
6、对于有内部转发的请求的幂等处理方式。因为在servlet规范中,forawrd在一个jvm里面会是由同一个线程处理。而且Spring MVC的不管内部出现几次forward(有人为forward,也有controller 层向上抛异常的error也会有forward到默认的/error),会在内部跳转的结束后,调用ResponseBodyAdvice。所以只需要关心ResponseBodyAdvice的内部实现即可
The Container Provider should ensure that the dispatch of the request to a target servlet occurs in the same thread of the same JVM as the original request.
7、代码和使用手册参考:https://github.com/amu007/springcloud-idempotent-starter
网友评论