nginx容灾配置,rpc重试机制,upstream配置

        proxy_connect_timeout 1s;
        proxy_send_timeout 8s;
        proxy_read_timeout 8s;

        proxy_next_upstream error timeout http_502 http_504;
        proxy_next_upstream_timeout 4s;
        proxy_next_upstream_tries 2;

nginx的超时配置:

  • proxy_connect_timeout
    nginx与upstream server的连接超时时间,默认60秒

  • proxy_read_timeout
    nginx接收upstream server数据超时, 默认60s, 如果连续的60s内没有收到1个字节, 连接关闭

  • proxy_send_timeout time;
    nginx发送数据至upstream server超时, 默认60s, 如果连续的60s内没有发送1个字节, 连接关闭

  • proxy_next_upstream_timeout
    nginx请求next upstream的总时长

  • proxy_next_uptream_tries
    nginx在 proxy_next_upstream_timeout 时间内可以重试的次数

问题:

proxy_next_upstream_timeout 和 proxy_xx_timeout的关系是怎样的?

梳理:

proxy_xx_time 都是针对upstream里面一个节点的超时时间,请求一个节点可以看做是一个原子操作,这个原子操作无论怎样都会按照自己的proxy_xx_timeout完成一次请求,在所有proxy_xx_timeout结束后依然得不到结果,这一次请求就超时了结束了

这次原子请求结束后,再来根据proxy_next_upstream_timeout来决定是否可以重试到下一个节点,如果原子请求结束后,用时还没到达proxy_next_upstream_timeout设置的时间,并且那么可以继续重试原子请求。

重试多少次?直到重试到proxy_next_upstream_timeout设置的时间 或者 proxy_next_uptream_tries 次数,只要有一个条件满足,重试就停止。 意味着:在proxy_next_upstream_timeout时间内可以重试proxy_next_uptream_tries 次。

如果在一个原子请求里,proxy_xx_timeout结束之前,proxy_next_upstream_timeout的时间更早结束,也就是说proxy_xx_timeout的时间总和 > proxy_next_upstream_timeout ,那么当原子请求完,就可以直接结束,不用重试了,因为早已超过了proxy_next_upstream_timeout 的超时时间。

这里一个很重要的概念是:proxy_xx_timeout是一个节点请求的原子超时时间,进去这原子请求里面,就无视外面的proxy_next_upstream_timeout 时间。怎么也得这原子请求结束了再来看是否能重试

举例:

假设现在upstream有两个节点,一个8100,一个8200,并且这两个端口都不会应答,都会超时

proxy_read_timeout=10
proxy_next_upstream_timeout=5
proxy_next_uptream_tries = 2

分析:原子请求需要花费10秒,10秒出来,proxy_next_upstream_timeout的5秒已经过去,不会再重试,此时access_log看到请求10秒后返回504timeout

proxy_read_timeout=2
proxy_next_upstream_timeout=5
proxy_next_uptream_tries = 2

分析:第一个原子请求8100花费2秒,出来后看到proxy_next_upstream_timeout=5,此时还剩下3秒,可以再重试,到了下一个节点8200,8200也会超时,此时proxy_next_upstream_timeout剩下1秒,还可以重试,但是没有节点了,此时access_log看到请求4秒后返回504timeout。 注意这里不会等待5秒再超时。没有节点了就直接返回504

进一步分析

上面的讨论都是针对节点超时来看是否能重试节点,当然实际上可能会因为节点5xx,4xx来决定重试,
proxy_next_upstream error timeout http_502 http_504; 这个配置就是决定什么情况需要进行重试的,这里配置的就是超时、502、504、异常返回。这种不是极端超时的情况,一般都能proxy_next_upstream_timeout在这超时范围内重试

总结:

nginx的这个proxy_next_upstream_timeout 是rpc微服务容灾的核心配置,这个配置简单但非常重要,决定着服务在异常的时候能否重试到别的节点,如果配置不当不能重试,那就会影响用户体验。

你可能感兴趣的:(nginx容灾配置,rpc重试机制,upstream配置)