针对优雅下线场景,MSE 提供 PreStop、自适应下线和延迟下线等功能和方案。
功能 | 功能介绍 | 适用场景 |
---|---|---|
PreStop | 通过在服务下线前配置注册寻址清除策略,消费方主动屏蔽下线实例的服务请求,降低业务提前中断而造成的损失。 | 容器化服务的服务发布。 |
自适应下线 | 自适应下线是对原有延迟下线的能力的补充。自适应下线就是在实例触发实际下线后,进行服务端接受请求、在途请求和刷新客户端缓存操作。用户无需关注驻留时间配置即可在最大限度避免实例下线的流量异常。 | 服务下线过程中完成在途请求处理,避免业务中断。 |
延迟下线 | 支持服务在注册中心注销后,延迟一定时间再下线实例,以确保在途请求的完成。延迟下线的时间支持自定义配置,默认为 5000 毫秒。无损下线详细介绍参见 延迟下线。 | 通过反注册和驻留时间,避免服务下线过程中的流量中断。 |
说明
preStop
参数。readiness
机制。无损下线插件会对 Spring 的 ContextClosedEvent
事件进行监听,当监听到 ContextClosedEvent
事件后,会主动通知实例进行下线。在容器场景利用 Kubernetes 提供的 preStop
机制,配合延迟下线 API 使用,可以实现流量的无损下线。
Kubernetes 提供了 Pod 优雅退出机制,允许 Pod 在退出前完成清理工作。preStop
执行后 Kubernetes 才会发送 TERM 信号至 Pod,最后 Pod 开启下线。
如下示例代码所示,仅需在 Kubernetes 的 preStop
机制中添加 MSE Agent API 指令 curl http://127.0.0.1:17000/lossless/deregister
。
改造前
lifecycle: preStop: exec: command: - /bin/sh - -c
改造后
lifecycle: preStop: exec: command: - /bin/sh - -c - "curl http://127.0.0.1:17000/lossless/deregister"
在自适应下线的周期内,MSE 会计算所有入口流量和出口流量,并对进行中的流量(即客户端发出,暂未到达服务器端的请求)和驻存流量(即在服务器应用进程内正在被处理的请求)进行合理的等待,以确保大部分流量不会受到突然下线的影响。
接入 Java 应用前在控制台开启 自适应下线 功能,并设置对应的时长即可,详情操作参见 接入 Java 应用。
自适应下线的核心点包括主动刷新客户端缓存,以及处理进行中和驻存的请求。
主动刷新客户端缓存
无损下线主要的难点在于:下线通知经由注册中心下发,通知传递到客户端的时延不可控。然而,客户端在每次请求时就能实时感知到服务端的信息状态。主要流程如下:
preStop
或者 sigTerm
信号后开启 过期 状态。处理进行中和驻存的请求
为了保障流量无损,MSE 将着重处理两种流量:进行中请求和驻存请求。
对于某些重点在 MQ/Redis/异步任务,聚焦于请求的自适应下线方案,往往不能合理估算出下线时间。因此,MSE 提供了自定义设置延迟下线时长的能力,您可以基于具体的业务场景和专家经验自行设置具体时长。
接入 Java 应用前在控制台开启 延迟下线 功能,并设置对应的时长即可,详情操作参见 接入 Java 应用。