文档

CLB、ALB、微服务等如何做到上下线的时候流量无损?

更新时间:

本文介绍在使用SAE时,如何解决上下线流量有损的问题。

说明

阿里云负载均衡SLB(Server Load Balancer)支持传统型负载均衡CLB(Classic Load Balancer)应用型负载均衡ALB(Application Load Balancer)。更多信息,请参见负载均衡SLB产品家族介绍

问题现象

在使用SAE过程中,CLB、ALB、微服务等上下线时流量有损。

问题原因

应用配置问题或客户端没有及时刷新服务列表的缓存。

解决方案

SAE单个实例视角的下线过程过长的步骤如下(同K8s):

  1. 实例进入Terminating状态。

  2. 如果该实例关联SLB、K8s Service等,并配置Readiness,则会将该实例摘除。关于应用业务就绪检查(Readiness)的更多信息,请参见设置健康检查

  3. 如果该实例配置PreStop,则会开始执行;PreStop执行完毕后,如果没有超过TerminationGracePeriodSeconds,则会向该实例的1号进程发送SIGTERM信号。关于PreStop的更多信息,请参见设置应用生命周期管理

  4. 在步骤3的PreStop或SIGTERM信号中,执行清理或者等待操作,平台会等待一段时间(即TerminationGracePeriodSeconds,默认值为30秒)。关于TerminationGracePeriodSeconds的更多信息,请参见设置应用生命周期管理

  5. 若超过TerminationGracePeriodSeconds进程还未结束,则发送SIGKILL信号,强制结束实例。

您可以基于以上步骤测试单个实例的下线过程。只要您的程序不是收到SIGTERM就马上退出,基本都能实现流量的优雅下线。但是,如果您的程序收到SIGTERM信号就马上退出,您需要处理SIGTERM信号或者配置PreStop。同时,您也可以根据实际情况,调大TerminationGracePeriodSeconds。

针对微服务应用,因为微服务客户端会缓存一些服务端信息,导致调用到已经下线的实例,所以需要服务端在客户端缓存过期前,进行等待。

  • (推荐)配置SAE无损下线功能。如何实现一键配置的具体操作,请参见设置微服务无损下线

  • 自行配置PreStop或者处理SIGTERM信号。参见上述步骤,在该方法内实现从注册中心摘除实例并且等待一段时间的逻辑(例如30~60秒)。

在发布滚动更新的过程中,假设当前是1个实例,重新部署时,为了满足最小存活实例数,SAE会确保先拉起一个新的实例,再销毁老的实例,不会出现流量有损的问题。因为,SAE多实例的轮转会确保实例整体满足“最小存活实例数”的配置,该值默认为1,可以在部署应用时修改。更多信息,请参见单批发布应用