本文為學習abtest切流方案方便以后查看大部分內容轉載自原文 https://blog.csdn.net/tanweii163/article/details/80543083
互聯網公司的業務發展過程中,當業務發展到一定階段后,野蠻生長的紅利逐漸消退,用戶增長空間在可見策略下變得不那么明顯的情況下,如何合理地規划產品迭代策略就顯得尤為重要了,而具體如何判斷產品策略是否有效,往往就需要數據進行判斷,其結果決定了該產品或策略的生命力以及與之配套的各類資源的調配,畢竟大部分公司是不會願意將資源浪費在無效的產品和策略上的。那么,通過什么樣的工具或手段才能確保數據驅動策略的有效落地和實施呢?
目前支付寶通過ABTest及建設與之相適配的實驗基礎設施平台來實現這樣的目標。作為比較前沿的一種思路與實踐,雖然目前在國內的普及程度還並不是很高,但是隨着國內互聯網ToC流量紅利的消退,這種工具會被越來越多的公司重視起來。
ABTest的目標&背景
在現實的產品設計場景中,我們經常會遇到多個設計方案的選擇。例如,App或網頁端某個頁面的某個按鈕的顏色是用藍色還是紅色,是放在左邊還是右邊?傳統的解決方案通常是集體表決或由某位Leader拍板,類似的選擇還有很多,從概率上很難保證傳統的選擇策略每次都是有效的,而ABTest顯然是一種更加科學的方法。
ABTest,簡單來說,就是為同一個產品目標制定兩個方案(比如兩個頁面一個用紅色的按鈕、另一個用藍色的按鈕),讓一部分用戶使用A方案,另一部分用戶使用B方案,然后通過日志記錄用戶的使用情況,並通過結構化的日志數據分析相關指標,如點擊率、轉化率等,從而得出那個方案更符合預期設計目標,並最終將全部流量切換至符合目標的方案。
ABTest的最終目標就是通過較少量用戶體驗來發布某些應用新功能。
實現思路
abtest對於業務開發來說,最好是獨立的,也就是我們需要在業務開發之外實現,無感知切入abtest,同時注意保持業務一致性,例如在某一時期,a用戶始終看到A版,B用戶始終看到B版。最終我們選用nginx+lua方案,通過在nginx中執行嵌入的lua腳本,動態計算upstream,將不同的用戶導向不同的程序版本,達到abtest的目的。
具體實現
我們通過提取某一個特征cookie標識用戶,該cookie在一定周期內針對同一個用戶不是隨意改變的。假如存在這個cookie,名稱為__abc=testuser.123123,如果cookie值為數值化,可以直接進行模運算取余,如果是字符型,先進行一個hash運算得到數值,再進行模運算取余。
如果業務系統不存在特征cookie,條件允許可以在網站域下種一個新的cookie。
數據流示意圖如下:
用戶b的cookie特征提取為001,跟配置的分流比例300比較,符合條件,將upstream改為b.domain.com, 用戶b一直訪問新版本程序。
nginx安裝lua模塊
lua-nginx-module官方文檔 ,請參考https://github.com/openresty/lua-nginx-module#installation,也可以直接安裝openresty。
nginx conf配置
初始化腳本
定時任務腳本
分流計算腳本
最后我們簡單做個操作界面,用於動態改變redis中的值
點擊切換開關,改寫流量切換比例
其他
如果cookie是字符串,可以先進行hash運算,下面是一個基於ffi的hash實現可以參考下,文件名是murmurhash2.lua