在微服务架构中,当服务提供者的应用实例出现异常,而服务消费者无法感知的时候,会影响服务的正常调用,并影响消费者的服务性能甚至可用性。HSF应用的离群实例摘除功能会检测应用和服务实例的可用性并进行动态调整,以保证服务成功调用,从而提升业务的稳定性和服务质量。

背景信息

在下图的示例场景中,某个系统包含4个应用,A、B、C和D,其中应用A会分别调用应用B、C和D。当应用B、C或D的某些实例异常时(如图中红色圆圈所示,应用B有一个异常实例,C和D有2个异常实例),如果应用A无法感知,会导致部分调用失败;如果B、C、D的异常实例较多,有可能影响应用A的性能甚至服务可用性。

为了保护应用A的服务性能和可用性,可以为应用A配置离群实例摘除。配置后,即可监控B、C、D应用的实例状态并进行动态调整(摘除或添加),以保证服务成功调用。

离群实例摘除示意

离群实例摘除流程如下:

  1. 当应用B、C或D的某个实例异常时,系统能够检测到,并根据配置的摘除实例比例上限判断是否将对应的实例从应用中摘除。
  2. 摘除实例后,A的调用请求不再被分发到B、C、D的异常实例上。
  3. 按配置的恢复检测单位时间开始检测异常实例是否恢复。
  4. 检测间隔随检测次数按恢复检测单位时间(默认为0.5分钟)线性增加,当达到设置的未恢复累计次数上限后,会按最长时间间隔持续检测异常实例是否恢复。
  5. 当检测到实例恢复后,将实例重新添加到应用的实例列表中,处理调用请求。同时,将检测间隔重置为恢复检测单位时间,例如0.5分钟。
说明
  • 当提供者应用的异常实例数量过多(超过摘除实例比例上限)时,仅按照设置的比例摘除。
  • 当提供者应用中仅剩最后一个可用实例时,即使错误率超过配置的阈值,也不会摘除该实例。

创建离群实例摘除策略

HSF应用可以创建应用和服务两个级别的离群实例摘除策略。

  1. 登录EDAS控制台
  2. 在左侧导航栏选择配置管理 > 配置列表
  3. 配置列表页面选择地域微服务空间,然后单击创建配置按钮。
  4. 创建配置页面输入参数和配置内容,然后在页面下方单击创建
    ACM-配置离群实例摘除

    离群实例摘除配置参数说明:

    • 所属地域:为您创建配置前所选的地域,不可修改。
    • 命名空间:为您创建配置前所选的命名空间,不可修改。
    • Data ID:配置ID,格式为<App ID>.QOSCONFIGApp ID可以在应用详情页获取。
    • Group:配置为HSF,不可修改。
    • 数据加密:选择配置数据是否加密。如果配置包含敏感数据,建议配置加密功能,以降低配置泄漏风险。
    • 配置格式:选择配置内容的数据格式。系统会按照你选择的格式进行数据校验。
    • 配置内容:输入离群实例摘除策略的配置。

      通过属性及其值配置HSF应用的离群实例摘除策略。可以基于应用和服务两种级别的进行配置,下面分别提供了这两种级别的配置示例。

      说明 服务级配置优先级高于应用级配置。
      • 应用级离群实例摘除配置示例
        {
        "DEFAULT": {
        "errorRateThreshold":0.5,
        "isolationTime":60000,
        "maxIsolationRate":0.2,
        "maxIsolationTimeMultiple":15,
        "qosEnabled":true,
        "requestThreshold":20,
        "timeWindowInSeconds":10,
        "ipDimension":true
        }
        }
      • 服务级离群实例摘除配置示例
        {
        "DEFAULT": {
        "errorRateThreshold":0.5,
        "isolationTime":60000,
        "maxIsolationRate":0.2,
        "maxIsolationTimeMultiple":15,
        "qosEnabled":true,
        "requestThreshold":20,
        "timeWindowInSeconds":10
        },
        "service:version": {
        "errorRateThreshold":0.5,
        "isolationTime":60000,
        "maxIsolationRate":0.2,
        "maxIsolationTimeMultiple":15,
        "qosEnabled":true,
        "requestThreshold":20,
        "timeWindowInSeconds":10
        }
        }

      如果您有其他需求,可以参考进行离群实例摘除参数说明配置。

离群实例摘除参数说明

您可以在配置管理中通过属性配置离群实例摘除策略,也可以在JVM中通过-D参数配置离群实例摘除策略。配置管理的配置优先级高于-D参数的配置优先级,推荐使用配置管理。

参数名称 属性 -D参数 作用 默认值
调用次数阈值 requestThreshold -Dhsf.qos.request.threshold 最近一次统计窗口内调用超过设置的调用次数阈值才会离群实例摘除。 10次
错误率下限 errorRateThreshold -Dhsf.qos.error.rate.threshold 当被调用的应用或服务中某个实例的错误率高于设置的下限后,将摘除该实例。 0.5
摘除实例比例上限 maxIsolationRate -Dhsf.qos.max.isolation.rate 摘除的异常实例比例上限,即达到阈值后,不再摘除异常实例。摘除异常实例数向下取整,例如应用实例总数为6,摘除实例比例设置为60%,摘除实例比例数为6×60%=3.6,则按策略最多摘除的实例数为3。若计算结果小于1,则摘除1个实例。 0.2
恢复检测单位时间 isolationTime -Dhsf.qos.isolation.time 在异常实例被摘除后,EDAS会不断按单位时间累加检测异常实例是否恢复正常,单位为ms。 60*1000ms(1分钟)
未恢复累计次数上限 maxIsolationTimeMultiple -Dhsf.qos.max.isolation.time.multiple EDAS会持续对异常实例进行检测,检测间隔随检测次数按恢复检测单位时间线性增加,当达到设置的检测次数上限后,会按最长时间间隔持续检测异常实例是否恢复。例如恢复检测单位时间设置60000 ms,未恢复累计次数上限设置为60,在第60次检测异常实例仍未恢复后,则会按60分钟(60×60000 ms)为间隔执行后续的检测。如果检测到实例已经恢复,则会将检测间隔重置为初始的时间间隔,即一次恢复检测单位时间。 60次
开启离群实例摘除 qosEnabled -Dhsf.qos.enable 是否对应用或服务开启离群实例摘除。 false
统计窗口 timeWindowInSeconds -Dhsf.qos.time.window.in.seconds 调用次数阈值的统计窗口,即统计时间周期。 10s
异常类型 bizExceptionPredicateClassName -Dhsf.qos.biz.exception.class.name 设置应用或服务实例异常类型。默认是所有业务异常,也可以通过自定义接口定义哪些属于业务异常。例如:
  • 定义所有业务异常属于异常:com.taobao.hsf.exception.CountBizExceptionPredicate
  • 忽略所有的业务异常:com.taobao.hsf.exception.IgnoreBizExceptionPredicate
  • 设置bizExceptionPredicate的实现com.taobao.hsf.Predicate的实例
com.taobao.hsf.exception.CountBizExceptionPredicate,即定义所有业务异常属于异常

结果验证

离群实例摘除策略配置并创建后,即开启了离群实例摘除。您可以进入配置了离群实例摘除的应用详情页面,查看该应用的监控信息,例如通过拓扑图观察调用请求是否还会转发到异常实例,应用调用的错误率/每分钟是否高于配置的错误率下限等,以便判断离群实例摘除策略是否生效。