億級流量實驗平台設計與實現


大家好,我是雨樂。今天給大家分享一款億級流量實驗平台。 在互聯網行業,要上線一個策略(CTR預估、CVR預估等),或者一個功能,如果貿然全量上線,那么如果新策略效果不佳,可能會造成不小的損失,要么丟失用戶,要么損失收入。

那么怎樣才能避免此問題發生呢?這就引入了實驗平台,通過對流量打標簽,然后分析實驗效果,從而再決定是否實驗推全還是下線。

一、概念

實驗平台,從字面意思來看,就是一個用來做實驗的平台。其 基本原理 就是把流量進行分流,特定流量,匹配特定策略。不同批次的用戶,看到的不同的策略。然后通過曝光、點擊等數據進行統計分析,得出實驗效果的好壞,從而決定是否推全該實驗。

換句話說,就是為同一個目標制定兩個方案(比如兩個頁面),將產品的用戶流量根據特定策略分割成 A/B 兩組,一組實驗組,一組對照組,兩組實驗同時運行一段時間后分別統計兩組用戶的表現,再將相關結果數據(比如 pv/uv、商機轉化率等)進行對比,就可以科學地幫助決策。

通過對流量進行分流,運行實驗,統計實驗數據,進行數據分析,然后得出實驗效果。如下【圖一】

圖一圖一

再根據實驗效果,進行反向數據分析,定位出實驗效果不好的源,進行頭腦風暴,再次做實驗,從而最終達到理想的實驗目的。如下【圖二】

圖二圖二

二、分層實驗模型

在進行實驗平台講解之前,先介紹下實驗平台的理論基礎,以便大家能夠更好的理解后面的內容。

現在業界大部分實驗平台,都基於谷歌2017年的一篇論文《Overlapping Experiment Infrastructure: More, Better, Faster Experimentation》,其模型架構如下圖【圖三】所示:

圖三圖三

在該模型中,有幾個概念:

  • 域(domain):划分的一部分流量
  • 層(layer):系統參數的一個子集
  • 實驗(exp):在一個域上,對一個或者多個參數修改,都將影響效果
  • 流量在每個層被打散(分配函數),層與層之間流量正交

下圖【圖四】為筆者線上實驗的一個簡略圖,在該圖中,總共有三個實驗層,分別為CTR預估層,用戶畫像層和頻次策略層。 圖四

從圖四可以看到,流量在層之間穿梭,而一個流量只能命中一個層中的一個實驗,一個流量請求過程可能會命中多個層中的多個實驗(每層命中一個實驗)。

使用分層實驗模型,需要滿足以下幾點:

  • 相關聯的策略參數位於同一實驗層(即都是做CTR預估,那么CTR預估相關的實驗,就放在同一層,即CTR預估層,以方便做實驗對比)
  • 相互獨立的策略參數分屬於不同的實驗層(如上圖中 ,CTR預估的實驗和頻次實驗是兩種性質不同的實驗,因此要放在兩層來實現,如果在一層的話,由於實驗性質不同,難以比較實驗效果)
  • 一個流量只能命中一個層中的一個實驗
  • 層之間的流量正交,不會互相影響(即層與層之間的實驗不會互相影響,如【圖五】)

圖五圖五

使用該分層模型作為實驗平台理論基礎的好處有以下幾點:

  • 可以作為一個獨立的部分,不與系統中的其他業務或者功能相互 影響
  • 每一層流量都是100%的全量,可以避免流量切分過細,保證實驗間的可對比性、客觀性
  • 層與層之間,流量獨立正交,不會互相影響

三、功能特點

一個可用或者完善的實驗平台,需要有以下幾個功能:

  • 支持多實驗並發迭代
  • 支持白名單體驗
  • 提供便捷的管理工具
  • 便捷的查看實驗效果分析數據
  • 支持實驗的切流和關閉
  • 保證線上實驗安全性
  • 支持實驗推全
  • 支持功能定制化

下面,我們將從幾個功能點出發,詳細講述各個功能的原理。

支持多實驗並發迭代,指的是一個完善的實驗平台,在功能上,需要支持多個實驗同時運行(包括同一層和不同層之間)。

支持白名單體驗:因為實驗分流有自己的策略,創建實驗的用戶不一定能夠命中這個實驗,而白名單的功能就是讓在白名單的用戶能夠每次都命中該實驗。

便捷的管理工具:這個指的是實驗后台,一個實驗后台需要能夠創建實驗,打開關閉實驗等

查看實驗效果分析數據:判斷一個實驗效果的好壞,就是通過實驗標簽分析實驗數據,能夠很直觀的觀察到實驗效果,從進行下一步實驗決策

實驗的切流和關閉:實驗的切流,指的是該實驗需要一定百分比的流量進行實驗,而實驗關閉,則指的是停掉該實驗

支持線上安全性:實驗平台,本身就是起錦上添花的作用,其只是用來打實驗標簽的,不可本末倒置,影響了線上業務的正常功能

支持實驗推全:一個實驗效果如果好的話,就需要將全部的流量都命中該實驗,而實驗推全就是達到此效果

支持功能定制:沒有一個實驗平台能夠滿足不同公司,甚至同一個公司不同部門之間的業務需求,但是,為了盡可能的向這個目標靠攏,實驗平台需要盡可能的靈活,低耦合,能夠盡量的配置化。

四、架構及模塊

實驗平台必備的三個模塊,分別為:

  • 管理后台
  • 實驗后台
  • 分流平台

管理后台主要是管理實驗的,包括創建和停止實驗等。實驗后台與管理后台進行數據上的交互,將管理后台的消息轉換成特有的消息,進行轉發和持久化。而分流平台,其一接收實驗后台的實驗消息建立內部維度索引,其二接收線上流量,根據流量屬性,給流量打上對應的標簽。

實驗平台架構 上圖,是一個實驗平台架構圖,下面從創建實驗角度,和流量的角度進行講解。

創建實驗角度:

1、在管理后台創建對應的實驗

2、管理后台將創建的實驗信息發送給實驗后台

3、實驗后台將實驗首先發送至消息系統(kafka等),然后將實驗落地持久化(DB)

4、分流平台消耗消息系統中的實驗消息,加載至內存

流量角度: 1、 流量攜帶其基本屬性(用戶畫像,app信息等)請求分流平台

2、 分流平台根據流量屬性,進行定制化匹配,然后使用分流算法,計算實驗標簽

3、流量返回至調用方SDK后,SDK上報曝光、點擊等信息至數據總線(大數據集群)

4、數據計算服務分析大數據集群的數據,計算對應的指標展示在管理后台。

實驗平台,從模塊划分上 ,如下圖所示: 實驗平台

五、設計與實現

在具體介紹下文之前,我們先理解一個概念,以便能更方便的理解下述內容。

桶

bucket即桶。實驗平台最底層,將流量進行hash之后,只能流入某一個桶里。

流量划分

一般有以下幾種划分方式:

  • 完全隨機
  • 用戶id哈希。
    • 該流量划分會使同一個用戶會一直命中同一實驗,從而保證了用戶體驗的一致性;而且也滿足對同一用戶具有累積效應的策略的實驗需求。但存在的問題就是,對於一些工具類屬性,沒有用戶id一說,只有設備id比如idfa和imei這些標記,但是隨着系統升級,這倆標記很難再獲取到,所以就需要系統能夠生成用戶唯一id
  • 用戶id + 日期作為一個整體進行哈希 這是一種更為嚴格的保證流量均勻性的分流方式,可以保證流量划分在跨時間維度上更為均勻。
    • 會犧牲用戶請求跨時間區間的一致性
    • 跟上面這種用戶id哈希存在同樣的問題
  • 用戶id尾號進行哈希
    • 流量不均勻
    • 也會存在用戶id所存在的問題

為了兼容上述幾種哈希划分方式的優點,而摒棄其缺點,我們引入了第四種流量划分方式:

bucket_id = hash(uid + layer_id) % 1000

常見的哈希算法有md5,crc以及MurmurHash等。

  • MD5消息摘要算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼散列函數,可以產生出一個128位(16字節)的散列值(hash value),MD5算法將數據(如一段文字)運算變為另一固定長度值,是散列算法的基礎原理。由美國密碼學家 Ronald Linn Rivest設計,於1992年公開並在 RFC 1321 中被加以規范。
  • CRC循環冗余校驗(Cyclic Redundancy Check)是一種根據網絡數據包或電腦文件等數據,產生簡短固定位數校驗碼的一種散列函數,由 W. Wesley Peterson 於1961年發表。生成的數字在傳輸或者存儲之前計算出來並且附加到數據后面,然后接收方進行檢驗確定數據是否發生變化。由於本函數易於用二進制的電腦硬件使用、容易進行數學分析並且尤其善於檢測傳輸通道干擾引起的錯誤,因此獲得廣泛應用。
  • MurmurHash 是一種非加密型哈希函數,適用於一般的哈希檢索操作。由 Austin Appleby 在2008年發明,並出現了多個變種,與其它流行的哈希函數相比,對於規律性較強的鍵,MurmurHash的隨機分布特征表現更良好。

其中,第三種MurmurHash算法,已經被很多開源項目使用,比如libstdc++ (4.6版)、Perl、nginx (不早於1.0.1版)、Rubinius、 libmemcached、maatkit、Hadoop以及redis等。而且經過大量的測試,其流量分布更加均勻,所以筆者采用的是此種哈希算法。

白名單

白名單,在實驗平台中算是比較重要的功能,其目的就是存在於白名單中的用戶優先於流量分桶,命中某個實驗。

需要注意的一點是,假如白名單所在實驗和流量經過哈希分桶之后的實驗是兩個不同的實驗,這就只能以白名單優先級為最高,換句話說,如果白名單命中了某個實驗,那么在該層上,就不該再命中其他實驗。

實驗后台

用來管理實驗的,比如權限管理、層管理等,如下圖:

在上圖中,管理后台,主要有以下幾個模塊:

  • 實驗管理,顧名思義,管理現有實驗和創建新實驗
    • 實驗列表:現有已經創建的所有實驗
    • 創建實驗:創建新實驗
  • 基礎配置,一些配置管理信息都在此模塊中
    • 實驗層:增刪改實驗層
    • 其他:針對實驗做的一些定制化,比如增加廣告位定向、年齡定向等
  • 系統管理,主要針對用戶及其分組
    • 分組管理,管理用戶屬於某個分組
    • 實驗平台的用戶權限管理,比如普通權限或者管理員權限

需要注意的是,用戶管理這塊的權限非常重要,因為實驗平台可能涉及到很核心的實驗,比如商業化中策略影響的實驗,所以用戶之間不能看到其他人創建的實驗,這層物理隔離非常重要。

分流平台

分流評估 ,顧名思義,對流量進行分離,有兩個功能:

  • 承接實驗后台的實驗消息,建立維度索引
  • 接收線上流量,根據維度索引、白名單以及對用戶設備哈希分桶后,給流量打標簽

分流平台,是整個實驗平台的核心模塊,一定要高性能,高可靠。

六、實驗效果

請求的實驗信息會以標簽的形式上報給sdk,sdk在進行曝光點擊的時候,會將這些信息上報,比如"123_456_789"格式。最終,這些會經過廣告實時流系統進行消費、數據清洗、實驗效果指標計算等工作。由於廣告系統是多業務指標系統,包括售賣率,ECPM, CTR, ACPE,負反饋率、財務消耗計算等。廣告實時流系統還需要日志的關聯工作,比如關聯廣告互動日志,廣告負反饋日志。實時流的計算的結果,會落地到druid 系統,方便實驗效果數據的快速檢索和二度加工。實驗效果實時指標數據計算延遲控制在一定的范圍內。

七、結語

最后需要提的是,實驗平台在效果跟蹤決策方面是有一定的局限性的。實驗平台可以進行實驗效果的快速跟蹤,但是卻很難進行實驗效果好壞的決策。比如:如果對比實驗效果指標值全部提高或下降了,可以簡單認為對比實驗的策略調整起正向作用或者反向作用;如果對比實驗的實驗效果指標值部分提高了,部分下降了,就不太好認定了。還有,實驗效果的短期效應和長期效應也可能是不一致,這將大大增加了實驗效果好壞的決策難度。

因此,實驗平台是可以快速提升廣告業務策略迭代效率的工具,但是要想進行實驗好壞評定的決策,還需要很長的路要走。

 

> 關注公眾號【高性能架構探索】,第一時間獲取干貨;回復【pdf】,免費獲取計算機經典書籍


免責聲明!

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



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