摘要:?本文作者: 思邪,阿里巴巴中間件技術(shù)專家,全程參與2018 雙11的技術(shù)支撐工作,長(zhǎng)期關(guān)注RPC及微服務(wù)技術(shù)領(lǐng)域,擅長(zhǎng)系統(tǒng)架構(gòu)和性能優(yōu)化。
需求
在今年的雙11準(zhǔn)備期間,業(yè)務(wù)同學(xué)提出要針對(duì)新零售進(jìn)行特殊的保障,希望新零售過(guò)來(lái)的流量,單獨(dú)進(jìn)入到一批機(jī)器,和其他普通流量隔離開(kāi)來(lái),這對(duì)新零售系統(tǒng)穩(wěn)定性提出更高的要求。
需求總結(jié)下來(lái)就是:
針對(duì)特殊流量可以在鏈路上按需選擇一些應(yīng)用,從所有機(jī)器(公共集群)里圈定一些機(jī)器作為特殊流量的專屬機(jī)器,以便對(duì)特殊流量進(jìn)行特殊支持。
普通流量不進(jìn)入專屬服務(wù)器,特殊流量可以按需使用普通服務(wù)器
如果鏈路上某個(gè)應(yīng)用app_x沒(méi)有劃出專屬機(jī)器,那么特殊流量和普通流量公用app_x的所有機(jī)器(我們稱之為公共集群)。
如果app_x劃了專屬機(jī)器,但是這些機(jī)器因?yàn)槟撤N原因不可達(dá),那么特殊流量可以根據(jù)配置的failover策略決定是否使用公共集群。
整個(gè)鏈路上各個(gè)應(yīng)用的劃出來(lái)的專屬機(jī)器組成了特殊流量的專屬通道,類似公交專用道。
我們的RPC框架已有的路由功能是在單次調(diào)用上生效,基于單次調(diào)用的路由功能實(shí)現(xiàn)全鏈路的路由會(huì)非常麻煩。所以我們提出了一個(gè)全鏈路上的做流量隔離的方案Dpath(Dedicated path)。
方案工作機(jī)制
我們分三步來(lái)說(shuō)明Dpath如何工作:
圈定專屬服務(wù)器
識(shí)別特殊流量
在鏈路上引導(dǎo)流量到對(duì)應(yīng)的服務(wù)器
圈定專屬機(jī)器
簡(jiǎn)單來(lái)說(shuō),我們需要的信息就是一個(gè)專屬環(huán)境里包含哪些應(yīng)用的哪些機(jī)器。該信息以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"
????????????????]
????????????}
????????]
????}
]
}上述配置申明了一個(gè)名為newRetail的專屬環(huán)境,里邊包含app1,app2,app3,newRetailEntryApp四個(gè)應(yīng)用以及對(duì)應(yīng)的機(jī)器。
Dpath工具包會(huì)訂閱該配置,各個(gè)中間件使用Dpath工具包即可獲知所需的信息。
識(shí)別流量
Dpath通過(guò)trace模塊(全鏈路的trace功能,可以在鏈路上傳遞數(shù)據(jù))攜帶的dpath_env屬性來(lái)識(shí)別當(dāng)前流量屬于哪一個(gè)專屬環(huán)境。具體如何根據(jù)請(qǐng)求信息映射到一個(gè)專屬環(huán)境是業(yè)務(wù)邏輯,由業(yè)務(wù)同學(xué)完成。這個(gè)識(shí)別動(dòng)作可以放在如下三個(gè)地方:
Nginx
可以根據(jù)http請(qǐng)求信息來(lái)識(shí)別流量。根據(jù)業(yè)務(wù)規(guī)則實(shí)現(xiàn)請(qǐng)求到dpath_env的映射,通過(guò)Nginx模塊生成將env信息添加到trace模塊的上下文
入口應(yīng)用
中間件取環(huán)境信息如果為空,默認(rèn)會(huì)使用當(dāng)前機(jī)器所屬的環(huán)境。所以如果入口應(yīng)用確定,那么將整個(gè)入口應(yīng)用劃到專屬環(huán)境即可。目前新零售都是這種模式。
業(yè)務(wù)代碼
業(yè)務(wù)代碼可以根據(jù)需要設(shè)置trace模塊上下文中的的dpath_env,隨時(shí)改變流量所屬的環(huán)境。
引導(dǎo)流量
dpath只定義了機(jī)器,環(huán)境,以及流量的關(guān)系,并沒(méi)有規(guī)定如何引導(dǎo)流量。引導(dǎo)流量由各個(gè)中間件自行實(shí)現(xiàn)。
這里只以rpc為例說(shuō)明如何基于Dpath的規(guī)則來(lái)引導(dǎo)流量到對(duì)應(yīng)的服務(wù)器。
為了方便理解,先忽略RPC其他的路由邏輯,看最簡(jiǎn)單情況下,單次調(diào)用的處理。沒(méi)有Dpath功能時(shí),RPC客戶端就是從注冊(cè)中心拿到service對(duì)應(yīng)的服務(wù)器列表,然后隨機(jī)調(diào)用。如下圖所示:

增加Dpath功能之后,服務(wù)名到服務(wù)器的映射中間插入了一個(gè)dpath_env的邏輯。RPC客戶端先根據(jù)請(qǐng)求上下文中的環(huán)境信息選中對(duì)應(yīng)環(huán)境的地址,然后隨機(jī)調(diào)用。如下圖所示:

整個(gè)鏈路上,一個(gè)專屬環(huán)境里所有應(yīng)用的專屬服務(wù)器串起來(lái)構(gòu)成了特殊流量的專屬路徑。如下圖所示:

newRetailEntryApp進(jìn)入的newRetail流量使用專屬機(jī)器
鏈路上沒(méi)有劃?rùn)C(jī)器給newRetail的應(yīng)用,使用公共集群
RPC之外,消息等中間件,都用各自的方式達(dá)到了類似的隔離效果。這里不再贅述細(xì)節(jié)。下面只提供一個(gè)RPC和消息支持Dpath的效果簡(jiǎn)圖:

野流量隔離
根據(jù)上面的描述,RPC的隔離邏輯是在客戶端生效。那么如果客戶端沒(méi)升級(jí)的話(很難快速協(xié)調(diào)所有客戶端統(tǒng)一升級(jí)),就會(huì)有未知流量打到專屬服務(wù)器,老客戶端過(guò)來(lái)的不符合規(guī)則的流量我們稱之為野流量。
為了解決野流量問(wèn)題。注冊(cè)中心的同學(xué)在發(fā)布訂閱功能的基礎(chǔ)上,提供了一個(gè)namespace功能。我們會(huì)把專屬服務(wù)器的服務(wù)發(fā)布到Dpath這個(gè)namespace下,普通服務(wù)器默認(rèn)發(fā)布到default這個(gè)namespace。新版本的客戶端會(huì)訂閱default+dpath兩個(gè)namespace的數(shù)據(jù),相當(dāng)于拿到全量地址。而注冊(cè)中心保證老的客戶端只能看到default空間下的數(shù)據(jù),這樣就不會(huì)有野流量達(dá)到專屬服務(wù)器了。
總結(jié)
Dpath是一個(gè)通用的流量隔離方案,可以支持一些需要隔離或者引導(dǎo)流量的場(chǎng)景,比如全鏈路常態(tài)隔離,灰度測(cè)試,藍(lán)綠發(fā)布等。
目前業(yè)務(wù)方主要是在全鏈路上按業(yè)務(wù)屬性進(jìn)行常態(tài)流量隔離,已經(jīng)在幾個(gè)新零售場(chǎng)景線上使用,并且經(jīng)歷了雙11的考驗(yàn)。
以下列舉一些業(yè)務(wù)流量隔離的好處:
業(yè)務(wù)方可以根據(jù)業(yè)務(wù)屬性的不同做不同的支持:個(gè)性的配置,更全的監(jiān)控等。
重要業(yè)務(wù)不受其他流量影響,不會(huì)因?yàn)槠渌髁客辉龆鴮?dǎo)致load高,被限流。
小集群支持單業(yè)務(wù),發(fā)布,回滾,都更快。當(dāng)特定業(yè)務(wù)出問(wèn)題時(shí),可以更快地響應(yīng)。
電子發(fā)燒友App














































評(píng)論