上次雪球的SRE同学过来交流的时候,一同聊到过关于后端节点优雅下线的一种情况:nginx将请求给了一个后端节点,这个请求在后端耗时较长,在请求还没处理完的时候后端恰好要做发布,发布时先将该节点对nginx的健康检测标记为不可用,这样nginx就将该节点从后端集群里摘掉了,若在这之后这个请求才处理完毕,是否还会正常的经过nginx返回给客户端,还是当nginx通过健康检测发现该后端节点已经不可用时,其建立的连接也已经不可用了呢?
当时问他们说也不太确定,后来忙忘了去验证一下,今晚写个小程序在tomcat端sleep 20秒才返回,然后通过nginx配置健康检测为1秒X2,测试结果表明,即使nginx发现后端节点已经不可用,只要该请求连接还保持,并不会被nginx端主动中止,20秒之后客户端仍会得到处理结果。
这样对于用nginx做负载,在后端发布时,对健康检测标记不可用之后只要再留出一定的时间让之前的请求都已响应完毕即可。