You need to enable JavaScript to run this app.
导航
应用无损下线
最近更新时间:2024.09.27 10:08:49首次发布时间:2024.09.27 10:08:49

针对优雅下线场景,MSE 提供 PreStop、自适应下线和延迟下线等功能和方案。

功能介绍

功能功能介绍适用场景
PreStop通过在服务下线前配置注册寻址清除策略,消费方主动屏蔽下线实例的服务请求,降低业务提前中断而造成的损失。容器化服务的服务发布。
自适应下线自适应下线是对原有延迟下线的能力的补充。自适应下线就是在实例触发实际下线后,进行服务端接受请求、在途请求和刷新客户端缓存操作。用户无需关注驻留时间配置即可在最大限度避免实例下线的流量异常。服务下线过程中完成在途请求处理,避免业务中断。
延迟下线支持服务在注册中心注销后,延迟一定时间再下线实例,以确保在途请求的完成。延迟下线的时间支持自定义配置,默认为 5000 毫秒。无损下线详细介绍参见 延迟下线通过反注册和驻留时间,避免服务下线过程中的流量中断。

操作步骤

第一步:PreStop

说明

  • 使用 PreStop 前,Kubernetes 中已配置 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 应用

alt

自适应下线的核心点包括主动刷新客户端缓存,以及处理进行中和驻存的请求。

  • 主动刷新客户端缓存

    无损下线主要的难点在于:下线通知经由注册中心下发,通知传递到客户端的时延不可控。然而,客户端在每次请求时就能实时感知到服务端的信息状态。主要流程如下:

    1. 服务端在接受到 preStop 或者 sigTerm 信号后开启 过期 状态。
    2. 过期 状态内,任何收到的请求,在响应时都会带上一个特殊的返回值 "x-mse-offline"。
    3. 收到响应的客户端,如果发现有返回值 "x-mse-offline" 请求,就会刷新负载均衡列表缓存,去除对应服务端实例。
  • 处理进行中和驻存的请求

    为了保障流量无损,MSE 将着重处理两种流量:进行中请求和驻存请求。

    • 进行中请求:它是指那些还在网络传输过程中的请求,即客户端已发出,但是暂未到达服务器端的请求。MSE 为其设定了一段合理的等待时间。
    • 驻存请求:它是指已经进入应用生命周期,正在做业务处理的请求。这部分我们会为所有入口请求和出口请求做记录与统计,缓存一个请求处理列表,保障所有请求处理真正完成后(最后一次响应)才开始停机。

第三步:(可选)延迟下线

对于某些重点在 MQ/Redis/异步任务,聚焦于请求的自适应下线方案,往往不能合理估算出下线时间。因此,MSE 提供了自定义设置延迟下线时长的能力,您可以基于具体的业务场景和专家经验自行设置具体时长。

接入 Java 应用前在控制台开启 延迟下线 功能,并设置对应的时长即可,详情操作参见 接入 Java 应用

alt