Categories
程式開發

大型賽事穩定性保障:Dpath 為世界軍人運動會護航


一、背景

第七屆世界軍人運動會是中國第一次承辦綜合性國際軍事賽事,有 100 多個國家、​​一萬多現役軍人參與競技。武漢軍運會票務系統建設和票務運營由大麥網承接,使用阿里集團基礎技術能力,通過大麥麥座票務系統提供票務管理、售賣和現場換驗服務。

大麥麥座票務系統(簡稱“麥座”)定位於現場娛樂的一站式行業服務平台,結合阿里的大數據、雲計算等能力,為場館向數字化、智能化的升級提供行業解決方案。麥座基礎架構經歷了從單機軟件部署到阿里雲的商戶獨立部署,再到 SaaS 化的演進過程。

目前麥座系統利用阿里巴巴的 pouch 容器,採用微服務的架構,為大量商戶提供統一的服務。多用戶共享服務的架構,實現了資源利用的最大化,方便版本的統一維護和升級。當承載軍運會等大型賽事,或者面對頭部 KA 客戶時,從安全、穩定性角度考慮,需要做獨立部署和流量隔離,從而避免突發流量影響到 KA 客戶。

二、目標

針對軍運會的場景,我們需要滿足:獨立部署、流量隔離。在滿足獨立部署和流量隔離的基礎上,需要滿足:

  1. 對開發盡量透明:盡可能少的定制和代碼侵入,對開發透明,不能因為獨立部署增加額外的開發和運維成本;

  2. 獨立部署的容器與普通分組的容器完全等價,且可以動態的切流:某個環境宕機的極端情況下,能夠快速切換,保證業務正常運行。

三、方案選型

為了實現獨立部署和流程隔離的目標,同時支持動態切流,我們調研了單元化、獨立應用、環境配置項、通過流量打標進行路由的方式。

單元化 獨立應用 環境配置項 流量標路由
介紹 獨立機房部署,通過域名等信息進行路由;可動態切流;實現了存儲隔離和異地容災 單獨的應用和代碼庫,可實現多版本的共存,無法代碼復用 同一個應用和代碼庫,獨立的分組,對應獨立的配置項。通過配置項維護 RPC 版本號等信息,實現隔離 根據商戶信息,對流量打標。 RPC 調用、消息隊列等根據打標信息進行路由,形成分組的隔離
部署成本 需要獨立的單元化環境,成本高 獨立應用需要測試、預發、線上環境,成本偏高 申請獨立的分組,成本低 申請獨立的分組,成本低
開發成本 對代碼無侵入,成本低 維護多套代碼,成本高 新增配置時需要修改多套配置項,成本偏高 RPC、消息隊列等中間件支持,對開發完全透明

通過對四個方案的比較,我們最終選擇流量打標路由的方式。阿里巴巴中間件 Dpath(Dedicated path),在請求中添加流量標識,通過 Diamond(持久配置管理中間件)把 Dpath 的打標規則,推送到各個應用容器。 RPC、消息隊列等中間件根據流量標和 Dpath 規則,進行路由,選擇相應的應用分組。

  1. Dpath 實現的需求:

1)針對特殊流量可以圈定一些特殊機器作為他的專屬的服務器,以便對特殊流量進行特殊保障或者測試;

2)普通流量不應該使用專屬服務器,特殊流量可以按需使用普通服務器;

3)整個鏈路上的專屬服務器組成了特殊流量的專屬通道,類似公交專用道。

  1. 基於 Dpath,我們需要實現:圈定專屬服務、識別特殊流量、在鏈路上引導流量到對應的服務器。

四、HTTP 流量路由

我們為每個應用申請獨立的應用分組,專門為軍運會提供服務(下文稱為軍運會分組)。然後在 Dpath 創建獨立的環境,選擇對應的分組,組成軍運會的集群環境。通過統一接入層,為軍運會分組配置獨立的域名。在 VipServer 進行配置,軍運會域名的請求關聯軍運會的分組。當某個分組宕機等原因導致服務不可用時。修改 VipServer,把域名的關聯切換到可用分組,保證流量的動態切換。

五、RPC 流量路由

RPC 的流量可以分為麥座內部系統的相互調用和麥座外系統的調用。針對麥座的內部流量,當請求經過某個分組時,自動在鏈路的上下文中打標。常見的 RPC 中間件(如 Dubbo)支持路由規則的配置。針對外部的流量,在 Diamond 中配置路由規則。 Diamond 把 Dpath 的路由規則推送到各個容器,包括流量標識和應用分組的映射關係。 RPC 中間件根據 Dpath 規則和流量標識,選擇對應的分組。

class DPathTagRule {
   boolean isOverwriteOn() {
      // 是否使用当前规则进行覆盖,默认为True
      return true
   }
   // 接口/方法级别规则
   String methodTagRule(String serviceName, String methodName, String[] paramTypeStrs){
      return null
   }
   // 参数级别
   Object argsTagRule(String servicenName, String methodName, String[] paramTypeStrs){
      return {
       Object[] args ->
       if (JYH_TENANT_ID.equals(args.getTenantId())) {
        return "jyh"
       } else {
        return null
       }
      }
   }
}

六、MQ 消息路由

Dpath 支持消息隊列的路由。 Dpath 通過為消息消費者(Consumer)配置消息 Filter 方式實現。不同分組的 Consumer,註冊時在用戶配置的 ConsumerId(cid)基礎上添加後綴。普通分組和軍運會分組都會接收到所有的消息。消息的生產者(Producer)發送消息時根據自己的機器分組,在消息體內打標。 Consumer 在消費消息之前,添加消息的過濾器。根據 Consumer 自己的機器分組,過濾掉非同分組的 Producer 發送的消息,僅消費同分組的 Producer 發送的消息。

大型賽事穩定性保障:Dpath 為世界軍人運動會護航 1

七、效果

通過 Dpath,我們用低成本的部署,實現了獨立部署和流量隔離。保障業務功能快速升級,同時兼顧最低維護和運行成本,保障流量和風險隔離。整個軍運會從上線到閉幕期間,整個售賣過程非常順利,無任何問題和故障。

作者介紹

阿里文娛技術專家 司楚

相關閱讀

電影垂直行業的雲智開放平台如何煉成?

阿里工程師帶你了解 B 端垂類營銷中心如何設計?

雲智前端技術如何賦能場館院線?

60 秒售出 5 萬張票!電影節搶票技術揭秘

電影行業提升 DCP 傳輸效率,還能這樣做!

超大型場館的繪座選座解決方案