首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >业务开发:防御性编程之网络超时与重试机制、幂等机制的关系

业务开发:防御性编程之网络超时与重试机制、幂等机制的关系

作者头像
崔认知
发布2023-06-19 16:51:24
发布2023-06-19 16:51:24
5570
举报
文章被收录于专栏:nobodynobody

网络超时并不意味着服务端业务执行失败


网络超时的情况可以分为服务端超时和客户端超时。当api请求超时,客户端并不知道服务端是否成功处理请求,即网络请求超时,服务端业务执行结果可能是成功,也可能是失败

题外:为什么一定要做超时处理配置?

如果客户端等待一项请求完成的时间比平常更长,它也会因将该资源用于处理请求而将资源保留更长时间。如果大量请求长时间占用资源,服务器的相应资源就可能耗尽。这些资源可能包括内存、线程、连接、临时端口或任何其他有限的资源。为了避免这种情况,客户端可以设置超时。超时是客户端等待请求完成的最长时间。 https://aws.amazon.com/cn/builders-library/timeouts-retries-and-backoff-with-jitter/

网络超时有效的处理方式-重试


网络超时,我们可以选择重试一次或者多次,直至得到响应。

通常,再次尝试相同的请求会使得请求成功。

重试可以同步,也可以异步。

重试和回退


重试是“自私的”。 换句话说,在客户端重试时,它将花费更多的服务器时间来获得更大的成功几率。在故障很少发生或瞬态发生的情况下,这并不是问题。这是因为重试请求的总数很小,并且增加表面可用性的权衡效果也很好。如果故障是由过载引起的,重试会增加负载,导致情况进一步恶化。在原始问题得到解决后,它们甚至可能会通过保持较高的负载造成恢复延迟。重试类似于强大的药物,应该以正确的剂量使用,使用过量只会造成严重损害。遗憾的是,在分布式系统中,几乎无法在所有客户端之间进行协调以实现正确的重试次数。 https://aws.amazon.com/cn/builders-library/timeouts-retries-and-backoff-with-jitter/

Amazon 采用的首选解决方案是回退。客户端不会立即积极地重试,而是在两次尝试之间等待一段时间。最常见的模式是指数回退,每次尝试后的等待时间都呈指数级延长。指数回退可能导致很长的回退时间,因为指数函数增长很快。为了避免重试太长时间,实现通常会将回退设置为最大值。可以预见,这称为上限指数回退。但是,这带来了另一个问题。现在,所有客户端都会不断尝试重设上限速率。我们的解决方案几乎在所有情况下都限制客户端重试的次数,并在面向服务的架构中更早地处理由此导致的故障。大多数时候,客户端都会放弃调用,因为它有着自己的超时时间。 https://aws.amazon.com/cn/builders-library/timeouts-retries-and-backoff-with-jitter/

重试与幂等


重试可能引起一些问题:

1、接口流量放大,接口访问的资源如数据库负载将增加;

2、重试可能导致业务落库数据重复,除非服务端接口保证幂等

3、重试次数与频率控制不好,容易使得系统不稳定;

等等。

我们介绍下幂等实现的几个注意事项:

1、引入幂等key设计时,服务端一定要落库幂等key;

2、服务端一定要检测幂等key的存在性,不存在需要保存幂等key,存在则继续后面的业务代码执行;

3、幂等key与业务一定保证原子性;

4、幂等key存储可以使用业务数据同一库落地存储,借用本地数据库事务保证原子性;

5、业务多数据源,本地事务变成分布式事务,但可以拆分为多个本地事务+幂等判断,来避免分布式事务的引入;

6、业务涉及到调用外部接口时的事务实现需要考虑;

7、一定考虑并发的情况,可以引入分布式锁;

等等。

总结


网络超时不代表服务端业务执行失败,重试是网络超时处理比较好的手段(一般用到的第三方库隐式实现提供重试,需注意),但是引入重试也会引起其它负面影响。接口幂等+分布式锁+拆分为本地事务 + 分布式事务等机制,可以有效避免重试带来的业务问题,处理不好,很容易造成多扣费、多发短信通知等等故障问题。


参考

https://docs.amazonaws.cn/cli/latest/userguide/cli-configure-retries.html

https://docs.aws.amazon.com/zh_cn/general/latest/gr/api-retries.html

https://aws.amazon.com/cn/builders-library/timeouts-retries-and-backoff-with-jitter/

Understanding Distributed Systems 2nd Edition 9781838430214: https://url97.ctfile.com/d/36436597-49598163-14c334?p=1988 (访问密码:1988) 5.7 Idempotency

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 认知科技技术团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 重试和回退
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档