需求
在今年的雙11準備期間,業務同學提出要針對新零售進行特殊的保障,希望新零售過來的流量,單獨進入到一批機器,和其他普通流量隔離開來,這對新零售系統穩定性提出更高的要求。
需求總結下來就是:
- 針對特殊流量可以在鍊路上按需選擇一些應用,從所有機器(公共叢集)裡圈定一些機器作為特殊流量的專屬機器,以便對特殊流量進行特殊支援。
- 普通流量不進入專屬伺服器,特殊流量可以按需使用普通伺服器
- 如果鍊路上某個應用app_x沒有劃出專屬機器,那麼特殊流量和普通流量公用app_x的所有機器(我們稱之為公共叢集)。
- 如果app_x劃了專屬機器,但是這些機器因為某種原因不可達,那麼特殊流量可以根據配置的failover政策決定是否使用公共叢集。
- 整個鍊路上各個應用的劃出來的專屬機器組成了特殊流量的專屬通道,類似公交專用道。
- 我們的RPC架構已有的路由功能是在單次調用上生效,基于單次調用的路由功能實作全鍊路的路由會非常麻煩。是以我們提出了一個全鍊路上的做流量隔離的方案Dpath(Dedicated path)。
方案工作機制
我們分三步來說明Dpath如何工作:
- 圈定專屬伺服器
- 識别特殊流量
- 在鍊路上引導流量到對應的伺服器
圈定專屬機器
簡單來說,我們需要的資訊就是一個專屬環境裡包含哪些應用的哪些機器。該資訊以JSON形式存放在配置中心,樣本如下:
{
"enable": true,
"envRules": [
{
"envName": "newRetail",
"failoverPolicy": 0,
"envAppRules": [
{
"appName": "app1",
"ips": [ ],
"machineGroups": [
"app1_newRetail_host"
]
},
{
"appName": "app2",
"ips": [ ],
"machineGroups": [
"app2_newRetail_host"
]
},
{
"appName": "app3",
"ips": [ ],
"machineGroups": [
"app3_newRetail_host"
]
},
{
"appName": "newRetailEntryApp",
"ips": [ ],
"machineGroups": [
"newRetailEntryApp_host"
]
}
]
}
]
}
上述配置申明了一個名為newRetail的專屬環境,裡邊包含app1,app2,app3,newRetailEntryApp四個應用以及對應的機器。
Dpath工具包會訂閱該配置,各個中間件使用Dpath工具包即可獲知所需的資訊。
識别流量
Dpath通過trace子產品(全鍊路的trace功能,可以在鍊路上傳遞資料)攜帶的dpath_env屬性來識别目前流量屬于哪一個專屬環境。具體如何根據請求資訊映射到一個專屬環境是業務邏輯,由業務同學完成。這個識别動作可以放在如下三個地方:
- Nginx
可以根據http請求資訊來識别流量。根據業務規則實作請求到dpath_env的映射,通過Nginx子產品生成将env資訊添加到trace子產品的上下文
- 入口應用
中間件取環境資訊如果為空,預設會使用目前機器所屬的環境。是以如果入口應用确定,那麼将整個入口應用劃到專屬環境即可。目前新零售都是這種模式。
- 業務代碼
業務代碼可以根據需要設定trace子產品上下文中的的dpath_env,随時改變流量所屬的環境。
引導流量
dpath隻定義了機器,環境,以及流量的關系,并沒有規定如何引導流量。引導流量由各個中間件自行實作。
這裡隻以rpc為例說明如何基于Dpath的規則來引導流量到對應的伺服器。
為了友善了解,先忽略RPC其他的路由邏輯,看最簡單情況下,單次調用的處理。沒有Dpath功能時,RPC用戶端就是從注冊中心拿到service對應的伺服器清單,然後随機調用。如下圖所示:

增加Dpath功能之後,服務名到伺服器的映射中間插入了一個dpath_env的邏輯。RPC用戶端先根據請求上下文中的環境資訊選中對應環境的位址,然後随機調用。如下圖所示:
整個鍊路上,一個專屬環境裡所有應用的專屬伺服器串起來構成了特殊流量的專屬路徑。如下圖所示:
- newRetailEntryApp進入的newRetail流量使用專屬機器
- 鍊路上沒有劃機器給newRetail的應用,使用公共叢集
RPC之外,消息等中間件,都用各自的方式達到了類似的隔離效果。這裡不再贅述細節。下面隻提供一個RPC和消息支援Dpath的效果簡圖:
野流量隔離
根據上面的描述,RPC的隔離邏輯是在用戶端生效。那麼如果用戶端沒更新的話(很難快速協調所有用戶端統一更新),就會有未知流量打到專屬伺服器,老用戶端過來的不符合規則的流量我們稱之為野流量。
為了解決野流量問題。注冊中心的同學在釋出訂閱功能的基礎上,提供了一個namespace功能。我們會把專屬伺服器的服務釋出到Dpath這個namespace下,普通伺服器預設釋出到default這個namespace。新版本的用戶端會訂閱default+dpath兩個namespace的資料,相當于拿到全量位址。而注冊中心保證老的用戶端隻能看到default空間下的資料,這樣就不會有野流量達到專屬伺服器了。
總結
Dpath是一個通用的流量隔離方案,可以支援一些需要隔離或者引導流量的場景,比如全鍊路常态隔離,灰階測試,藍綠釋出等。
目前業務方主要是在全鍊路上按業務屬性進行常态流量隔離,已經在幾個新零售場景線上使用,并且經曆了雙11的考驗。
以下列舉一些業務流量隔離的好處:
- 業務方可以根據業務屬性的不同做不同的支援:個性的配置,更全的監控等。
- 重要業務不受其他流量影響,不會因為其他流量突增而導緻load高,被限流。
- 小叢集支援單業務,釋出,復原,都更快。當特定業務出問題時,可以更快地響應。