更新时间:2022-09-13 GMT+08:00
分享

升级零中断

要实现升级零中断,通常需要解决如下问题:

  1. 停止服务的时候,可能引起业务中断。在停止服务的过程中,可能服务正在处理请求,新的请求可能持续的发送到该服务。
  2. 在微服务架构下,一般都会通过注册中心进行服务发现,客户端会缓存实例地址。停止服务的时候,使用者可能无法及时感知实例下线,并继续使用错误的实例进行访问,导致失败。
  3. 实现升级零中断,需要进行滚动升级,在新版本功能就绪后,才能够停止老版本。

实现升级零中断需要很多的措施进行配合,比如滚动升级,实现零中断,建议保证最小有2个可用的实例。在本章节里面,主要描述从微服务的角度进行设置,更好的配合升级零中断。Java Chassis实现零中断的核心机制包括如下几个:

  1. 优雅停机。服务停止的时候,需要等待请求完成,并拒绝新请求。

    Java Chassis优雅停机默认提供,在进程退出前,会进行一定的清理动作,包括等待正在处理的请求完成、拒绝未进入处理队列的新请求、调用注册中心接口进行注销等动作。Java Chassis进程退出前,先将实例状态修改为DOWN,然后等待一段时间再进行后续的退出过程:

    servicecomb:
      boot:
        turnDown:
          # 实例状态修改为DOWN以后等待时间,默认值为0,即不等待。
          waitInSeconds: 30 
  2. 重试:客户端对于网络连接错误,以及被拒绝等请求,需要选择新服务器进行重试。

    开启重试策略:

    servicecomb:
      loadbalance:
        retryEnabled: true # 是否开启重试策略
        retryOnNext: 1  # 重新寻找一个实例重试的次数(不同于失败实例,依赖于负载均衡策略)
        retryOnSame: 0  # 在失败的实例上重试的次数
  3. 隔离:对于失败超过一定次数的服务实例,进行隔离。

    开启实例隔离策略:

    servicecomb:
      loadbalance:
        isolation:
          enabled: true
          enableRequestThreshold: 5 # 统计周期内实例至少处理的请求数,包括成功和失败。
          singleTestTime: 60000 # 实例隔离后,经过这个时间,会尝试访问。如果访问成功,则取消隔离,否则继续隔离。
          continuousFailureThreshold: 2 # 实例隔离的条件,连续两次失败。
分享:

    相关文档

    相关产品