多活容災(zāi)MSHA(Multi-Site High Availability)是一個(gè)云原生的多活容災(zāi)架構(gòu)解決?案,同城流量封閉是指調(diào)用都在同一可用區(qū)內(nèi)進(jìn)行,減少和避免跨可用區(qū)調(diào)用帶來的響應(yīng)時(shí)間增長。本文通過一個(gè)電商業(yè)務(wù)案例,介紹如何進(jìn)行同城流量封閉的操作。

業(yè)務(wù)背景信息

電商業(yè)務(wù).png

本示例的電商業(yè)務(wù)包含以下應(yīng)用:

  • frontend:入口Web應(yīng)用,負(fù)責(zé)和用戶交互。
  • cartservice:購物車應(yīng)用。記錄用戶的購物車數(shù)據(jù),使用自建的Redis。
  • productservice:商品應(yīng)用。提供商品、庫存服務(wù),使用RDS MySQL。

技術(shù)棧:

  • SpringBoot。
  • RPC框架:SpringCloud,注冊(cè)中心使用自建的Eureka。

案例背景

本示例電商業(yè)務(wù)在進(jìn)行了多可用區(qū)部署后,避免了在一個(gè)可用區(qū)部署的單點(diǎn)風(fēng)險(xiǎn)。也因此導(dǎo)致應(yīng)用間的RPC調(diào)用會(huì)出現(xiàn)跨可用區(qū)的情況。跨可用區(qū)的網(wǎng)絡(luò)傳輸帶來了RT的延遲,導(dǎo)致電商頁面加載和操作出現(xiàn)明顯的響應(yīng)慢和卡頓現(xiàn)象。為了保障用戶體驗(yàn),業(yè)務(wù)開始考慮如何減少、避免跨可用區(qū)調(diào)用來避免RT的猛增。

假設(shè)同地域的網(wǎng)絡(luò)雙向延遲約為5 ms,若一個(gè)調(diào)用鏈包含100次RPC調(diào)用,則最多可能出現(xiàn)100次跨可用區(qū)調(diào)用,最大RT延遲為500 ms(5 ms×100)。

同城多活架構(gòu)改造

同城多活架構(gòu)改造,請(qǐng)參見同城多活架構(gòu)實(shí)踐

開啟單元格流量封閉策略

MSHA提供的同城多活架構(gòu)能力,除了容災(zāi)恢復(fù)(同城切流)能力外,還針對(duì)常見RPC框架(HSF、SpringCloud、Dubbo)提供了單元格流量封閉的能力。下面將電商業(yè)務(wù)的各個(gè)應(yīng)用,均配置和啟用閾值為20%的單元格流量封閉策略。

說明 閾值可選范圍為[0,100]。閾值表示:當(dāng)一個(gè)單元格內(nèi)應(yīng)用健康的機(jī)器和總機(jī)器占比≥${閾值} 時(shí),則流量封閉策略生效。
  1. 封閉策略開啟前,驗(yàn)證是否存在跨單元格(可用區(qū))的RPC調(diào)用。
    1. 登錄AHAS控制臺(tái)
    2. 在控制臺(tái)左側(cè)導(dǎo)航欄中單擊多活容災(zāi)
    3. 在左側(cè)導(dǎo)航欄選擇同城多活 > SpringCloud配置,在頂部菜單欄選擇官方示例命名空間
    4. SpringCloud配置頁面,確認(rèn)各個(gè)應(yīng)用流量封閉啟用狀態(tài)未配置
    5. 在MSHA商城,查看導(dǎo)購請(qǐng)求的實(shí)際調(diào)用鏈路,存在跨單元格(可用區(qū))的RPC調(diào)用。
      查看鏈路3.png
  2. 封閉策略開啟后,驗(yàn)證是否存在跨單元格(可用區(qū))的RPC調(diào)用。
    1. 登錄AHAS控制臺(tái)
    2. 在控制臺(tái)左側(cè)導(dǎo)航欄中單擊多活容災(zāi)
    3. 在左側(cè)導(dǎo)航欄選擇同城多活 > SpringCloud配置,在頂部菜單欄選擇官方示例命名空間
    4. SpringCloud配置頁面,選中所有應(yīng)用,單擊批量開啟/修改
    5. 修改閾值的文本框輸入20,然后單擊確定

      所有應(yīng)用開啟流量封閉狀態(tài),如下圖所示。

      流量封閉.png
    6. 在MSHA商城,查看導(dǎo)購請(qǐng)求的實(shí)際調(diào)用鏈路,不存在跨單元格(可用區(qū))的RPC調(diào)用。

      路由規(guī)則如下:

      • 流量按比例(50%)分流到2個(gè)單元格的入口Web應(yīng)用。
      • RPC調(diào)用在單元格(可用區(qū))內(nèi)封閉。

      RPC調(diào)用在單元格B內(nèi)封閉如下圖所示:

      查看鏈路4

      RPC調(diào)用在單元格I內(nèi)封閉如下圖所示:

      查看鏈路5.png