1.背景
由于多种外在因素(停电、断网等)与多种内在因素(系统bug、服务器宕机、操作系统崩溃等)会导致我们的系统或者服务不能时刻保持可用状态。为了出现问题尽快恢复系统,减少出现问题带来的影响。我们就会使用超时和重试机制
平时接触到涉及远程调用的系统或者服务都会使用应用超时和重试机制。通常单体服务只涉及到数据库、缓存、第三方API、中间件等网络调用,而微服务系统内部还存在网络调用
2.超时机制
简单来说超时机制就是一个请求超过指定的时间还没处理完,这个请求就会被直接取消并抛出指定的异常(RuntimeException)或者错误(504)。
超时分为两种:
-
连接超时:客户端与服务端建立连接的最长等待时间
-
读取超时:客户端与服务端已经建立了链接,客户端等待服务端处理完请求的最长时间长
系统如果没有设置超时,就有可能导致服务端连接爆炸和大量的请求堆积,而且如果这些堆积的请求会消耗系统资源,影响新的请求处理。甚至可能会导致系统内存飙升而导致宕机、重启。
3.重试机制
基于上面的超时,导致有可能出现的问题。重试机制(花费更多的服务器时间来获得更大的成功几率)可以解决一部分。重试是在遇到瞬态和随机错误时提供高可用性的一种强大机制。但是应该如何合理的设置重试的次数与系统的架构相关。
重试幂等
在重试时一个相同的请求,短时间内多次执行,会导致系统或者服务不必要的多次执行。这样就需要对重试加以控制或者对重试增加幂等。
重试加以控制:设置定时任务,时间间隔不要太短。这样不会导致短时间内发送多次请求
幂等:对同样的请求参数,服务端不做任何处理 可以直接返回。
4.监控告警
由于重试是解决一些非系统bug造成的问题。所以一些系统问题而导致的重试 就需要去加入监控告警。在重试次数之中还没有正确恢复的请求,需要加入到告警中。方便问题的暴漏与排查