多活容灾MSHA(Multi-Site High Availability)是一个云原生的多活容灾架构解决⽅案,同城流量封闭是指调用都在同一可用区内进行,减少和避免跨可用区调用带来的响应时间增长。本文通过一个电商业务案例,介绍如何进行同城流量封闭的操作。

业务背景信息

电商业务.png

本示例的电商业务包含以下应用:

  • frontend:入口Web应用,负责和用户交互。
  • cartservice:购物车应用。记录用户的购物车数据,使用自建的Redis。
  • productservice:商品应用。提供商品、库存服务,使用RDS MySQL。

技术栈:

  • SpringBoot。
  • RPC框架:SpringCloud,注册中心使用自建的Eureka。

案例背景

本示例电商业务在进行了多可用区部署后,避免了在一个可用区部署的单点风险。也因此导致应用间的RPC调用会出现跨可用区的情况。跨可用区的网络传输带来了RT的延迟,导致电商页面加载和操作出现明显的响应慢和卡顿现象。为了保障用户体验,业务开始考虑如何减少、避免跨可用区调用来避免RT的猛增。

假设同地域的网络双向延迟约为5 ms,若一个调用链包含100次RPC调用,则最多可能出现100次跨可用区调用,最大RT延迟为500 ms(5 ms×100)。

同城多活架构改造

同城多活架构改造,请参见同城多活架构实践

开启单元格流量封闭策略

MSHA提供的同城多活架构能力,除了容灾恢复(同城切流)能力外,还针对常见RPC框架(HSF、SpringCloud、Dubbo)提供了单元格流量封闭的能力。下面将电商业务的各个应用,均配置和启用阈值为20%的单元格流量封闭策略。

说明 阈值可选范围为[0,100]。阈值表示:当一个单元格内应用健康的机器和总机器占比≥${阈值} 时,则流量封闭策略生效。
  1. 封闭策略开启前,验证是否存在跨单元格(可用区)的RPC调用。
    1. 登录AHAS控制台
    2. 在控制台左侧导航栏中单击多活容灾
    3. 在左侧导航栏选择同城多活 > SpringCloud配置,在顶部菜单栏选择官方示例命名空间
    4. SpringCloud配置页面,确认各个应用流量封闭启用状态未配置
    5. 在MSHA商城,查看导购请求的实际调用链路,存在跨单元格(可用区)的RPC调用。
      查看链路3.png
  2. 封闭策略开启后,验证是否存在跨单元格(可用区)的RPC调用。
    1. 登录AHAS控制台
    2. 在控制台左侧导航栏中单击多活容灾
    3. 在左侧导航栏选择同城多活 > SpringCloud配置,在顶部菜单栏选择官方示例命名空间
    4. SpringCloud配置页面,选中所有应用,单击批量开启/修改
    5. 修改阈值的文本框输入20,然后单击确定

      所有应用开启流量封闭状态,如下图所示。

      流量封闭.png
    6. 在MSHA商城,查看导购请求的实际调用链路,不存在跨单元格(可用区)的RPC调用。

      路由规则如下:

      • 流量按比例(50%)分流到2个单元格的入口Web应用。
      • RPC调用在单元格(可用区)内封闭。

      RPC调用在单元格B内封闭如下图所示:

      查看链路4

      RPC调用在单元格I内封闭如下图所示:

      查看链路5.png