新浪的動態(tài)策略灰度發(fā)布系統(tǒng):ABTestingGateway

ABTesingGateway 是一個可以動態(tài)設(shè)置分流策略的灰度發(fā)布系統(tǒng),工作在7層序仙,基于tengine谬返,采用ngx-lua開發(fā),使用 redis 作為分流策略數(shù)據(jù)庫光涂,可以實現(xiàn)動態(tài)調(diào)度功能庞萍。

nginx是目前使用較多的7層服務(wù)器,可以實現(xiàn)高性能的轉(zhuǎn)發(fā)和響應(yīng)忘闻;ABTestingGateway 是在 nginx 轉(zhuǎn)發(fā)的框架內(nèi)钝计,在轉(zhuǎn)向 upstream 前,根據(jù) 用戶請求特征 和 系統(tǒng)的分流策略 齐佳,查找出目標(biāo)upstream私恬,進(jìn)而實現(xiàn)分流。

在以往的基于 nginx 實現(xiàn)的灰度系統(tǒng)中炼吴,分流邏輯往往通過 rewrite 階段的 if 和 rewrite 指令等實現(xiàn)本鸣,優(yōu)點是性能較高,缺點是功能受限硅蹦、容易出錯荣德,以及轉(zhuǎn)發(fā)規(guī)則固定,只能靜態(tài)分流提针。針對這些缺點命爬,我們設(shè)計實現(xiàn)了ABTesingGateway,采用 ngx-lua 實現(xiàn)系統(tǒng)功能辐脖,通過啟用lua-shared-dictlua-resty-lock作為系統(tǒng)緩存和緩存鎖,系統(tǒng)獲得了較為接近原生nginx轉(zhuǎn)發(fā)的性能皆愉。




ABTesingGateway 的架構(gòu)簡圖

Features:

支持多種分流方式嗜价,目前包括iprange艇抠、uidrange、uid尾數(shù)和指定uid分流

動態(tài)設(shè)置分流策略久锥,即時生效家淤,無需重啟

可擴(kuò)展性,提供了開發(fā)框架瑟由,開發(fā)者可以靈活添加新的分流方式絮重,實現(xiàn)二次開發(fā)

高性能,壓測數(shù)據(jù)接近原生nginx轉(zhuǎn)發(fā)

灰度系統(tǒng)配置寫在nginx配置文件中歹苦,方便管理員配置

適用于多種場景:灰度發(fā)布青伤、AB測試和負(fù)載均衡等

系統(tǒng)實現(xiàn)

分流功能:

轉(zhuǎn)發(fā)分流是灰度系統(tǒng)的主要功能,目前 ABTesingGateway 支持ip段分流(iprange)殴瘦、uid用戶段分流(uidrange)狠角、uid尾數(shù)分流(uidsuffix)和指定特殊uid分流(uidappoint)四種方式。

ABTesingGateway 依據(jù)系統(tǒng)中配置的運行時信息runtimeInfo進(jìn)行分流工作蚪腋;通過將 runtimeInfo 設(shè)置為不同的分流策略丰歌,實現(xiàn)運行時分流策略的動態(tài)更新,達(dá)到動態(tài)調(diào)度的目的屉凯。

系統(tǒng)運行時信息設(shè)置

如圖所示

系統(tǒng)管理員通過系統(tǒng)管理接口將分流策略policy設(shè)置為運行時策略立帖,并指定該策略對應(yīng)的分流模塊名divModulename和用戶信息提取模塊名userInfoModulename后,系統(tǒng)可以進(jìn)行分流工作悠砚。

系統(tǒng)對用戶請求進(jìn)行分流時厘惦,首先獲得系統(tǒng)運行時信息runtimeInfo中的信息,然后提取用戶特征userInfo哩簿,最后分流模塊divModule根據(jù)分流策略dviDataKey和用戶特征userInfo查找出應(yīng)該轉(zhuǎn)發(fā)到的upstream宵蕉。如果沒有對應(yīng)的upstream,則將該請求轉(zhuǎn)向默認(rèn)upstream节榜。

以iprange分流為例

1

2

3

4

5

6

7

8

9

以某個iprange分流策略為例:

????{

????????"divtype":"iprange",

????????"divdata":[

????????????????????{"range":{"start":1111,?"end":2222},?"upstream":"beta1"},

????????????????????{"range":{"start":3333,?"end":4444},?"upstream":"beta2"},

????????????????????{"range":{"start":7777,?"end":8888},?"upstream":"beta3"}

??????????????????]

????}

其中divdata中的每個 range:upstream 對中羡玛,range 為 ip 段,upstream 為 ip 段對應(yīng)的后端宗苍;range 中的 start 和 end 分別為 ip 段的起始和終止稼稿, ip以整型表示。 當(dāng)灰度系統(tǒng)啟用iprange分流方式時讳窟,會根據(jù)用戶請求的ip進(jìn)行分流轉(zhuǎn)發(fā)让歼。 假如用戶請求中的ip信息轉(zhuǎn)為整型后是4000,將被轉(zhuǎn)發(fā)至beta2 upstream丽啡。

分流過程流程圖

分流過程流程圖

管理功能:

管理功能架構(gòu)圖

1.?管理員登入后谋右,得到系統(tǒng)信息視圖,運行時信息視圖补箍,可以進(jìn)行策略管理和運行時信息管理

2.?業(yè)務(wù)接口層向管理員提供??增/刪/查/改??接口

3.?適配層將承擔(dān)業(yè)務(wù)接口與分流模塊的溝通工作

4.?適配層提出統(tǒng)一接口改执,開發(fā)人員可以通過實現(xiàn)接口來添加新的分流方式

管理接口:

[策略管理接口]????

????#分流策略檢查啸蜜,參數(shù)為一個分流策略數(shù)據(jù)的json串

????1.?/admin/policy/check

????#分流策略添加,參數(shù)與check接口一致

????2.?/admin/policy/set

????#分流策略讀取辈挂,參數(shù)為要讀取策略的policyid

????3.?/admin/policy/get

????#分流策略刪除衬横,參數(shù)為要刪除策略的policyid

????4.?/admin/policy/del

[運行時信息管理接口]

????#設(shè)置分流策略為運行時策略,參數(shù)為policyid

????1.?/admin/runtime/set

????#獲取系統(tǒng)當(dāng)前運行時信息终蒂,無參數(shù)

????2.?/admin/runtime/get

????#刪除系統(tǒng)運行時信息蜂林,關(guān)閉分流接口,無參數(shù)

????3.?/admin/runtime/del

快速部署

軟件依賴

tengine-2.1.0

LuaJIT-2.1-20141128

ngx_lua-0.9.13

lua-cjson-2.1.0.2

redis-2.8.19

系統(tǒng)部署

repo中的utils/conf文件夾中有灰度系統(tǒng)部署所需的最小示例

1.?git?clone?https://github.com/SinaMSRE/ABTestingGateway

2.?cd?/path/to/ABTestingGateway/utils

#啟動redis數(shù)據(jù)庫

3.?redis-server?conf/redis.conf?

#啟動upstream?server拇泣,其中stable為默認(rèn)upstream

4.?/usr/local/nginx/sbin/nginx?-p?`pwd`?-c?conf/stable.conf

5.?/usr/local/nginx/sbin/nginx?-p?`pwd`?-c?conf/beta1.conf

6.?/usr/local/nginx/sbin/nginx?-p?`pwd`?-c?conf/beta2.conf

7.?/usr/local/nginx/sbin/nginx?-p?`pwd`?-c?conf/beta3.conf

8.?/usr/local/nginx/sbin/nginx?-p?`pwd`?-c?conf/beta4.conf

#啟動灰度系統(tǒng)噪叙,proxy?server,灰度系統(tǒng)的配置也寫在conf/nginx.conf中

9.?/usr/local/nginx/sbin/nginx?-p?`pwd`?-c?conf/nginx.conf

灰度系統(tǒng)使用demo

管理功能

1.?部署并啟動系統(tǒng)

2.?查詢系統(tǒng)運行時信息挫酿,得到null

0>?curl?127.0.0.1:8030/admin/runtime/get

{"errcode":200,"errinfo":"success?","data":{"divModulename":null,"divDataKey":null,"userInfoModulename":null}}

3.?查詢id為9的策略构眯,得到null

0>?curl?127.0.0.1:8030/admin/policy/get?policyid=9

{"errcode":200,"errinfo":"success?","data":{"divdata":null,"divtype":null}}

4.?向系統(tǒng)添加策略,返回成功早龟,并返回新添加策略的policyid

???????以uidsuffix尾數(shù)分流方式為例惫霸,示例分流策略為:

????????????{

????????????????"divtype":"uidsuffix",

????????????????"divdata":[

????????????????????????????{"suffix":"1",?"upstream":"beta1"},

????????????????????????????{"suffix":"3",?"upstream":"beta2"},

????????????????????????????{"suffix":"5",?"upstream":"beta1"},

????????????????????????????{"suffix":"0",?"upstream":"beta3"}

??????????????????????????]

????????????}

添加分流策略接口?/admin/policy/set?接受json化的policy數(shù)據(jù)

0>?curl?127.0.0.1:8030/admin/policy/set?-d?'{"divtype":"uidsuffix","divdata":[{"suffix":"1","upstream":"beta1"},{"suffix":"3","upstream":"beta2"},{"suffix":"5","upstream":"beta1"},{"suffix":"0","upstream":"beta3"}]}'

{"errcode":200,"errinfo":"success??the?id?of?new?policy?is?0"}

5.?查看添加結(jié)果

0>?curl?127.0.0.1:8030/admin/policy/get?policyid=0

{"errcode":200,"errinfo":"success?","data":{"divdata":["1","beta1","3","beta2","5","beta1","0","beta3"],"divtype":"uidsuffix"}}

6.?設(shè)置系統(tǒng)運行時策略為?0號策略

0>?curl?127.0.0.1:8030/admin/runtime/set?policyid=0

{"errcode":200,"errinfo":"success?"}

7.?查看系統(tǒng)運行時信息,得到結(jié)果

0>?curl?127.0.0.1:8030/admin/runtime/get

{"errcode":200,"errinfo":"success?","data":{"divModulename":"abtesting.diversion.uidsuffix","divDataKey":"ab:test:policies:0:divdata","userInfoModulename":"abtesting.userinfo.uidParser"}}

8.?當(dāng)訪問接口不正確返回時葱弟,將返回相應(yīng)的?錯誤碼?和?錯誤描述信息

0>?curl?127.0.0.1:8030/admin/policy/get?policyid=abc

{"errcode":50104,"errinfo":"parameter?type?error?for?policyID?should?be?a?positive?Integer"}

分流功能

在驗證管理功能通過壹店,并設(shè)置系統(tǒng)運行時策略后,開始驗證分流功能

1.?分流芝加,不帶用戶uid硅卢,轉(zhuǎn)發(fā)至默認(rèn)upstream

0>?curl?127.0.0.1:8030/

this?is?stable?server

2.?分流,帶uid為30藏杖,根據(jù)策略将塑,轉(zhuǎn)發(fā)至beta3

0>?curl?127.0.0.1:8030/??-H?'X-Uid:30'

this?is?beta3?server

3.?分流,帶uid為33蝌麸,根據(jù)策略点寥,轉(zhuǎn)發(fā)至beta2

0>?curl?127.0.0.1:8030/??-H?'X-Uid:33'

this?is?beta2?server

壓測結(jié)果:

壓測環(huán)境下灰度系統(tǒng)與原生nginx轉(zhuǎn)發(fā)的對比圖

壓測環(huán)境下灰度系統(tǒng)與原生nginx轉(zhuǎn)發(fā)的數(shù)據(jù)對比

如圖所示,用戶請求完全命中cache是理想中的情況来吩,灰度系統(tǒng)在理想情況下可以達(dá)到十分接近原生nginx轉(zhuǎn)發(fā)的性能敢辩。

產(chǎn)生圖中壓測結(jié)果的場景是:用戶請求經(jīng)過proxy server轉(zhuǎn)向upstream server,訪問1KB大小的靜態(tài)文件弟疆。

proxy server的硬件配置:

CPU:E5620 2.4GHz 16核

Mem:24GB

Nic:千兆網(wǎng)卡戚长,多隊列

線上部署簡圖:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市怠苔,隨后出現(xiàn)的幾起案子同廉,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恤溶,死亡現(xiàn)場離奇詭異乓诽,居然都是意外死亡帜羊,警方通過查閱死者的電腦和手機(jī)咒程,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讼育,“玉大人帐姻,你說我怎么就攤上這事∧潭危” “怎么了饥瓷?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長痹籍。 經(jīng)常有香客問我呢铆,道長,這世上最難降的妖魔是什么蹲缠? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任棺克,我火速辦了婚禮,結(jié)果婚禮上线定,老公的妹妹穿的比我還像新娘娜谊。我一直安慰自己,他們只是感情好斤讥,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布纱皆。 她就那樣靜靜地躺著,像睡著了一般芭商。 火紅的嫁衣襯著肌膚如雪派草。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天铛楣,我揣著相機(jī)與錄音近迁,去河邊找鬼。 笑死蛉艾,一個胖子當(dāng)著我的面吹牛钳踊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播勿侯,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拓瞪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了助琐?” 一聲冷哼從身側(cè)響起祭埂,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蛆橡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舌界,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年泰演,在試婚紗的時候發(fā)現(xiàn)自己被綠了呻拌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡睦焕,死狀恐怖藐握,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情垃喊,我是刑警寧澤猾普,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站本谜,受9級特大地震影響初家,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜乌助,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一溜在、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧眷茁,春花似錦炕泳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至登刺,卻和暖如春籽腕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纸俭。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工皇耗, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人揍很。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓郎楼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親窒悔。 傳聞我的和親對象是個殘疾皇子呜袁,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容