文档首页 > > 最佳实践> 使用Java SDK实现升级零中断

使用Java SDK实现升级零中断

分享
更新时间: 2020/06/09 GMT+08:00

需要解决的问题

  1. 停止服务的时候,可能引起业务中断。在停止服务的过程中,如果服务正在处理请求,新的请求可能持续的发送到该服务。
  2. 在微服务架构下,一般都会通过服务中心进行服务发现,客户端会缓存实例地址。停止服务的时候,使用者可能无法及时感知实例下线,并继续访问,导致访问失败。
  3. 新服务启动起来后,会存在灰度状态,出现多个版本并存的现象。如果新服务增加了接口,使用者需要将请求发送到包含新接口的服务。
  4. 实现升级零中断,可以先准备大量的备份机器,将新服务启动起来。然后对用户的请求进行引流,待老服务没有流量后,停止老服务。这需要运维人员准备额外的集群资源并开发强大的运维监控系统。

使用CSE Java SDK框架,能够以极低的成本,不借助运维工具,就能够实现升级零中断。

实践与评估

在讨论零中断的时候,需要先设计一个测试评估模型。为了简单,采用下面测试场景来进行评估。

调用者通过网关来访问应用实例1和应用实例2,现在要对应用实例进行升级。升级的过程中,调用者会启动N个线程,以Mtps的流量来请求。我们以整个升级过程出现的失败次数来评估零中断升级的性能。

为了节省资源,我们采用先停止1.0版本的实例1,然后部署2.0版本的实例1;再停止1.0版本的实例2,最后部署2.0版本的实例2。另外,我们还需要构造服务端处理时延T,模拟请求正在处理的情况。

在这个过程中,使用测试数据如下:

调用者线程数N

调用者流量M

处理时延T

失败次数

10

20tps

0

10

80tps

0

10

600tps

0

10

80tps

100ms

0

实现原理

实现零中断的核心机制包括如下几个:

  1. 优雅停机。服务停止的时候,需要等待请求完成,并拒绝新请求;
  2. 重试:客户端对于网络连接错误,以及拒绝请求错误,需要选择新服务器进行重试。
  3. 隔离:对于失败超过一定次数的服务实例,进行隔离。

在上面的测试数据中,在microservice.yaml中配置重试策略为:

servicecomb:
  loadbalance:
    retryEnabled: true
    retryOnNext: 1
    retryOnSame: 0

在microservice.yaml中配置隔离策略为:

servicecomb:
  loadbalance:
    myservice:
      isolation:
        enabled: true
        enableRequestThreshold: 5
        singleTestTime: 10000
        continuousFailureThreshold: 2

测试过程中,在停止1.0版本实例2的时候,需要确保2.0版本实例1已经正确处理请求,否则会出现无实例可用、升级中断的现象。

相关推荐

以上升级零中断的实现仅仅借助了CSE Java SDK。通过配合CSE的灰度发布、部署工具等功能,可以实现更加可靠的升级零中断,获得更好的体验。

分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

智能客服提问云社区提问