新浪的動態策略灰度發布系統:ABTestingGateway


原文鏈接:http://www.open-open.com/lib/view/open1439889185239.html

ABTesingGateway 是一個可以動態設置分流策略的灰度發布系統,工作在7層,基於tengine,采用ngx-lua開發,使用 redis 作為分流策略數據庫,可以實現動態調度功能。

nginx是目前使用較多的7層服務器,可以實現高性能的轉發和響應;ABTestingGateway 是在 nginx 轉發的框架內,在轉向 upstream 前,根據 用戶請求特征 和 系統的分流策略 ,查找出目標upstream,進而實現分流。

在以往的基於 nginx 實現的灰度系統中,分流邏輯往往通過 rewrite 階段的 if 和 rewrite 指令等實現,優點是性能較高,缺點是功能受限、容易出錯,以及轉發規則固定,只能靜態分流。針對這些缺點,我們設計實現了ABTesingGateway,采用 ngx-lua 實現系統功能,通過啟用lua-shared-dictlua-resty-lock作為系統緩存和緩存鎖,系統獲得了較為接近原生nginx轉發的性能。

 

 

 

新浪的動態策略灰度發布系統:ABTestingGateway

ABTesingGateway 的架構簡圖

Features:

  • 支持多種分流方式,目前包括iprange、uidrange、uid尾數和指定uid分流

  • 動態設置分流策略,即時生效,無需重啟

  • 可擴展性,提供了開發框架,開發者可以靈活添加新的分流方式,實現二次開發

  • 高性能,壓測數據接近原生nginx轉發

  • 灰度系統配置寫在nginx配置文件中,方便管理員配置

  • 適用於多種場景:灰度發布、AB測試和負載均衡等

系統實現

分流功能:

轉發分流是灰度系統的主要功能,目前 ABTesingGateway 支持ip段分流(iprange)、uid用戶段分流(uidrange)、uid尾數分流(uidsuffix)和指定特殊uid分流(uidappoint)四種方式。

ABTesingGateway 依據系統中配置的運行時信息runtimeInfo進行分流工作;通過將 runtimeInfo 設置為不同的分流策略,實現運行時分流策略的動態更新,達到動態調度的目的。

  1. 系統運行時信息設置

    新浪的動態策略灰度發布系統:ABTestingGateway

    如圖所示

    • 系統管理員通過系統管理接口將分流策略policy設置為運行時策略,並指定該策略對應的分流模塊名divModulename和用戶信息提取模塊名userInfoModulename后,系統可以進行分流工作。

    • 系統對用戶請求進行分流時,首先獲得系統運行時信息runtimeInfo中的信息,然后提取用戶特征userInfo,最后分流模塊divModule根據分流策略dviDataKey和用戶特征userInfo查找出應該轉發到的upstream。如果沒有對應的upstream,則將該請求轉向默認upstream。

  2. 以iprange分流為例

    以某個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 段對應的后端;range 中的 start 和 end 分別為 ip 段的起始和終止, ip以整型表示。 當灰度系統啟用iprange分流方式時,會根據用戶請求的ip進行分流轉發。 假如用戶請求中的ip信息轉為整型后是4000,將被轉發至beta2 upstream。

  3. 分流過程流程圖

    新浪的動態策略灰度發布系統:ABTestingGateway

    分流過程流程圖

管理功能:

新浪的動態策略灰度發布系統:ABTestingGateway

管理功能架構圖

1. 管理員登入后,得到系統信息視圖,運行時信息視圖,可以進行策略管理和運行時信息管理
2. 業務接口層向管理員提供  增/刪/查/改  接口
3. 適配層將承擔業務接口與分流模塊的溝通工作
4. 適配層提出統一接口,開發人員可以通過實現接口來添加新的分流方式

管理接口:

[策略管理接口]    
    #分流策略檢查,參數為一個分流策略數據的json串
    1. /admin/policy/check
    #分流策略添加,參數與check接口一致
    2. /admin/policy/set
    #分流策略讀取,參數為要讀取策略的policyid
    3. /admin/policy/get
    #分流策略刪除,參數為要刪除策略的policyid
    4. /admin/policy/del

[運行時信息管理接口]
    #設置分流策略為運行時策略,參數為policyid
    1. /admin/runtime/set
    #獲取系統當前運行時信息,無參數
    2. /admin/runtime/get
    #刪除系統運行時信息,關閉分流接口,無參數
    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

系統部署

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

1. git clone https://github.com/SinaMSRE/ABTestingGateway
2. cd /path/to/ABTestingGateway/utils

#啟動redis數據庫
3. redis-server conf/redis.conf 

#啟動upstream server,其中stable為默認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

#啟動灰度系統,proxy server,灰度系統的配置也寫在conf/nginx.conf中
9. /usr/local/nginx/sbin/nginx -p `pwd` -c conf/nginx.conf

灰度系統使用demo


  1. 管理功能

    1. 部署並啟動系統
    
    2. 查詢系統運行時信息,得到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. 向系統添加策略,返回成功,並返回新添加策略的policyid
           以uidsuffix尾數分流方式為例,示例分流策略為:
                {
                    "divtype":"uidsuffix",
                    "divdata":[
                                {"suffix":"1", "upstream":"beta1"},
                                {"suffix":"3", "upstream":"beta2"},
                                {"suffix":"5", "upstream":"beta1"},
                                {"suffix":"0", "upstream":"beta3"}
                              ]
                }
    添加分流策略接口 /admin/policy/set 接受json化的policy數據
    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. 查看添加結果
    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. 設置系統運行時策略為 0號策略
    0> curl 127.0.0.1:8030/admin/runtime/set?policyid=0
    {"errcode":200,"errinfo":"success "}
    
    7. 查看系統運行時信息,得到結果
    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. 當訪問接口不正確返回時,將返回相應的 錯誤碼 和 錯誤描述信息
    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"}
  2. 分流功能

    在驗證管理功能通過,並設置系統運行時策略后,開始驗證分流功能
    
    1. 分流,不帶用戶uid,轉發至默認upstream
    0> curl 127.0.0.1:8030/
    this is stable server
    
    2. 分流,帶uid為30,根據策略,轉發至beta3
    0> curl 127.0.0.1:8030/  -H 'X-Uid:30'
    this is beta3 server
    
    3. 分流,帶uid為33,根據策略,轉發至beta2
    0> curl 127.0.0.1:8030/  -H 'X-Uid:33'
    this is beta2 server

壓測結果:

新浪的動態策略灰度發布系統:ABTestingGateway

壓測環境下灰度系統與原生nginx轉發的對比圖

新浪的動態策略灰度發布系統:ABTestingGateway

壓測環境下灰度系統與原生nginx轉發的數據對比

如圖所示,用戶請求完全命中cache是理想中的情況,灰度系統在理想情況下可以達到十分接近原生nginx轉發的性能。

產生圖中壓測結果的場景是:用戶請求經過proxy server轉向upstream server,訪問1KB大小的靜態文件。

proxy server的硬件配置:

  • CPU:E5620 2.4GHz 16核

  • Mem:24GB

  • Nic:千兆網卡,多隊列

線上部署簡圖:

新浪的動態策略灰度發布系統:ABTestingGateway

項目主頁:http://www.open-open.com/lib/view/home/1439889185239


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM