隨着閒魚用戶快速增加,運營活動愈來愈趨於精細和個性化,運營會根據用戶偏好爲其投放合適的活動,以下圖所示在閒魚首頁商品展現時,會在商品的列表中插入活動Banner,經過這些活動banner引導用戶進入到相應活動會場,實現會場導流。閒魚投放系統負責閒魚運營活動的配置、管理、投放。前端
主要解決了如下幾個問題算法
1.配置環境隔離問題,根據開發規範,任何線上業務必須先進行線下環境發佈,測試驗證經過後再發布上線。因此提供的管理平臺須要擁有線上和線下環境隔離的能力。數據庫
2.檢索中的性能問題,在同一資源位下會配置多個活動,每次檢索時須要把該資源位下的全部活動拉出來,按照條件進行篩選出符合要求的活動,這個過程會隨着資源位下的活動增多檢索遇到性能瓶頸。小程序
3.人羣管理問題,在活動中會配置投放的人羣,每次檢索活動時人羣做爲活動的檢索條件,須要驗證用戶是否屬於當前活動的人羣,因此須要解決用戶和人羣關係的管理。緩存
4.AB測試問題,運營投放的活動每每須要進行AB測試比較不一樣策略的表現,此時須要提供AB測試的能力。
下面將經過介紹閒魚投放系統設計、技術方案設計和實現過程,進一步闡述如何解決上面提出的四個問題。數據結構
閒魚投放系統是一個配置管理和配置檢索的系統,換句話講他不生產任何活動素材,他只是活動素材的搬運工。下面介紹閒魚投放的系統設計。架構
如上圖所示閒魚投放系統共分爲了活動素材層、投放配置層、業務流程層和應用層四個層次。性能
活動素材層是對在閒魚投放系統中全部素材源的彙總,目前閒魚投放中主要聚集了三種素材魯班素材、馬赫素材、TPP素材,魯班素材提供了用戶個性化Banner的能力,他的原理是根據用戶的行爲獲取到偏好的商品,而後把商品圖和素材模板組合爲一個Banner;馬赫素材提供規則圈選商品,他的原理是利用規則引擎把規則轉換爲SQL語句,而後利用該SQL在商品表中撈出符合規則的商品,同時馬赫利用流計算能力對增量商品也實現了實時的規則圈選。TPP素材提個性化商品推薦,例如首頁的商品推薦和猜你喜歡的商品推薦,TPP做爲個性化推薦平臺,能夠根據不一樣的算法實現不一樣的推薦策略。測試
投放配置層是開放給運營能力的彙總,包含活動配置、環境隔離、數據報表三種能力。活動配置是對一個資源位下全部投放行爲的具體配置,以下圖所示
優化
每一個資源位會投放多個活動,活動與活動之間須要進行排期,每一個投放活動中包含人羣和素材兩類信息,人羣用來肯定該活動投放的對象,素材用來肯定該活動投放的內容,同時在人羣下支持AB的能力。環境隔離是爲了可以區分線上和線下業務,保證線上的投放環境在線下充分驗證後再進行上線。數據報表是對全部投放活動關鍵指標的數據彙總。
業務流程層是閒魚投放系統的關鍵,主要負責投放活動的檢索,根據調用方傳入的用戶信息和資源位信息,返回該資源位下符合該用戶的活動。
具體的檢索邏輯如上圖所示,首先在DB中查詢當前資源位下的全部在線活動,而後依次過濾每一個活動下的人羣信息是否符合當前用戶,從符合該用戶的活動列表中選取一個活動,若是該活動下有AB測試,須要請求AB測試平臺獲取AB測試中配置的素材信息,最後返回該活動下的素材內容,客戶端拿到活動素材後進行展現。
應用層是對客戶端能力的彙總,包括獲取素材、素材樣式展現、數據埋點。素材展現是直接與用戶交互的部分,須要前端提供多種展現樣式,數據埋點是爲了驗證AB策略和收集活動關鍵指標數據。
在上文中咱們提到閒魚投放面臨四個須要解決的問題,分別是環境隔離問題、活動檢索問題、人羣管理問題、AB能力問題。下面將分別從這幾個問題出發介紹解決的方法。
3.1 人羣管理問題
人羣管理使用的是集團內的奧格人羣平臺,他爲咱們提供了人羣圈選和人羣驗證的能力,在很大程度上解放了閒魚投放的人羣管理,下面簡單的介紹一下該平臺的實現原理。
如上圖所示展現了奧格幾個核心功能點,實現原理是這樣的,首先平臺會提供給用戶可選擇的規則,而後利用規則引擎把所選的規則,生成SQL查詢語句和流計算規則,SQL查詢語句用來離線圈選用戶和流計算規則用來實時篩選新增用戶,經過離線規則和在線規則實現了奧格的人羣圈選,在人羣驗證階段,首先利用倒排檢索的思想,用戶和人羣的關係利用倒排數據結構標識,該方法解決了單用戶與多人羣關係驗證的效率問題,最後利用多級緩存和熱點數據本地緩存的方式解決人羣檢索RT問題。
3.2 AB測試管理問題
AB測試是用來驗證方案的經常使用方法,經常使用的AB測試方案大可能是用戶惟一屬性取模的方式按比例劃分用戶,可是會面臨不少複雜的問題1.按照用戶的id進行取模計算,對於未登陸用戶處理是一個常被忽略的問題。2.測試白名單管理,在AB測試時須要把特定人員劃分到特定測試桶裏。3.多個AB正交測試,若是有多個AB測試,此時須要正交測試時會出現更復雜的狀況。在閒魚投放中使用了集團的一休AB平臺,一休提供基於用戶、設備等多維度AB策略,同時支持白名單與正交AB測試的複雜場景,在AB基本能力的基礎上提供了數據分析的能力,實現了調用到數據管理的一體化。
3.3環境隔離問題
解決環境隔離問題主要是爲了方便測試,先在線下看效果,而後再把數據配置到線上。爲了實現環境隔離迭代兩次技術方案。
首先介紹第一個方案,依照整體功能設計我但願平臺中每一個模塊均可以靈活複用,能夠利用已有模塊,快速搭建出知足業務要求的投放活動,因此從業務角度進行了抽象,把能拆分的模塊儘量的抽象出來,最終的實體關係以下圖所示。從業務邏輯角度共抽象了6個實體分別是資源位(Resource)、活動(Activity)、人羣(Crowd)、素材(Data Source)、資源位和活動的關係(Resource Plan)、活動和人羣素材的關係(Activity Plan)實體,每一個模塊之間能夠按照下圖的關係進行自由組合成一個投放活動。
在該方案中利用每一個實體中的env字段解決環境隔離問題,不管是在投放活動配置仍是在檢索過程當中,只能夠利用相同env字段的實體,該方法徹底實現了環境隔離,可是在實際的應用中效果卻不是很好,由於利用一份數據表中的env字段實現環境隔離,因此線上和線下對應的Resource Plan和Activity Plan關係表中關聯的實體ID不一樣,那麼將沒法實現線下配置直接拷貝到線上,此時須要在線下和線上兩次配置,因爲配置過於複雜增長錯誤風險。
下面介紹第二個方案,第二個技術方案中對方案一中提出的問題進行優化。具體的設計以下圖所示:
如上圖所示,實體對象由6個轉換爲4個,下面一次介紹這些實體和如何解決環境隔離問題。
首先介紹新引入的Data Schema實體,DataSchema是由開發同窗負責,提供了一個配置好的JSON配置模板,他與Resource進行關聯,意味着當前Resource下的全部DataSource都將按照該DataSchema提供的JSON模板進行配置,同時在解析時也按照當前的DataSchema進行解析
Resource再也不區分線上和線下環境,由於Resource不管是線上和線下他老是存在的而且不會改變的,因此區分線上和線下是沒有必要的。
DataSource再也不用env字段區分線上和線下環境,利用preData和onlineData進行區分線上和線下配置,因爲引入了DataSchema模板,因此完全解放了DataSource,他再也不須要進行繁瑣的配置,只需按照DataSchema把全部的須要字段都配置到對應的Schema中便可。這樣在線上和線下DataSource是一條數據主鍵再也不改變。
Activity實體是DataSource和Resource的關係實體,同時包括活動的人羣、起止時間等屬性。因爲DataSource和Resource實體線上和線下環境中主鍵ID都不會改變,那麼意味着Activity能夠把線下的配置直接同步到線上,在同步過程當中須要作的是若是線上沒有配置就插入一條若是存在就更新。那麼怎麼映射Activity線下和線上的關係呢,在Activity裏面引入了mapId字段,線下的Activity實體在mapId中存儲線上Activity實體的主鍵Id,利用這種映射關係實現了線下和線上的映射。
具體的如上圖所示,經過這種表和表之間映射關係,實現了環境隔離問題,同時簡化了業務中的實體,讓配置更簡單更易用。
3.4活動檢索問題
在實際應用中,咱們遇到了檢索能力的性能瓶頸,根據每次檢索時都須要拉出當前資源位下的所有活動,而後按照起止時間、人羣做爲過濾條件,篩選出知足當前用戶的活動列表。以上過程當中每次檢索都會發生與數據庫的IO操做。當資源位和訪問QPS增多時,數據庫IO操做將成倍數增加,此時會成爲檢索的瓶頸,因此在以上的技術方案中,須要一個完備的緩存方案支撐檢索的正常運行。按照常規的緩存設計方案進行了以下的緩存方案設計。
全部的查詢都是先進行緩存查詢,若是未命中再查詢數據庫,把查詢到的數據回寫到緩存中。對於全部的更新操做,都是先更新數據庫,而後再失效緩存,在更新活動時,須要在失效活動緩存的同時,也要失效該活動對應資源位下活動列表的緩存。
可是在使用過程當中遇到了一個問題,資源位下的活動列表存儲採用了kv結構,key爲資源位ID,value爲活動列表的JSON序列化,當資源位下的活動增多時value也會隨着膨脹最後超出閾值,因此把活動對象進行了簡化僅存儲活動Id和人羣Id。優化後檢索過程將有所變化以下圖所示:
4.1總結
經過以上的總體功能設計、技術方案設計、代碼實現,介紹了一個投放平臺從設計到實現過程當中遇到的問題點和解決方案。目前投放平臺已經在閒魚的用戶實時觸達、首頁feeds投放、淘寶閒魚小程序投放中使用,完美支持運營根據人羣精準投放活動。
4.2展望
閒魚素材投放平臺但仍有須要持續完善的地方,首先是精準人羣的個性化,例如在首頁的投放中,針對圈選的人羣透出的Banner圖片都是同樣的,目前咱們的投放最小粒度是人羣將來將會作到我的。而後是投放能力自優化,目前活動針對資源位的爭奪仍是利用權重、人羣、起止時間做爲前置條件,將來將會經過投放數據迴流利用算法計算其關鍵指標實現投放的自優化。同時閒魚素材投放將對接集團內部的更多優秀的素材提供源豐富閒魚的活動。
本文爲雲棲社區原創內容,未經容許不得轉載。