揭秘!闲鱼拉新投放系统如何设计
背景
閑魚目前已經是國內最大的閑置物品交易平臺。隨著閑魚體量的增長和用戶規模不斷擴大,閑魚App上的一個普通banner抑或是feeds中的一張普通的卡片,每天都可能被數以千萬計的人看到。
為了更好地服務好廣大的用戶群體,更加個性化的內容推薦和更加精細化的素材投放就顯得尤為必要了。今天我們來聊一聊如何設計一個可以精準觸達用戶、運營快速試錯、解放開發生產力的投放系統。
思路分析
投放是什么?舉例來說,往城市廣場的一塊廣告牌上在不同時段不同場景下更換廣告畫就是一種投放,當然互聯網技術帶來了人的維度,不同用戶看到的廣告畫可能也是不一樣的。我們來看下這樣一個系統應該包含哪些功能。
1、我們把“城市廣場上的那塊廣告牌”叫資源位,那么需要一個服務端接口來獲取需要透出的素材。
 2、不同資源位需要透出的素材格式可能是不一樣的,可能是banner,可能是feeds,可能是運營自定義的手填數據,可能是任何合理的數據結構。
 3、同一個資源位,不同時段,針對不同平臺、不同人群,透出的素材可能是不一樣的,那么就需要有一個服務來在一堆素材中篩選出適合資源位的內容。在資源位命中了多個素材的時候,還需要有一些機制來裁決出最終透出的那一個。
詳細設計
我們設計的投放系統扮演的是前端實體資源位和后端多種數據源之間的橋梁的角色。它負責從各個業務數據源中根據一定規則篩選出在特定資源位上需要透出的數據,基本的數據流如下圖所示:
資源位
所謂資源位,在我們這個體系內,是指前端頁面上的實體坑位。是技術同學在產品開發中創建的。理所當然,資源位需要消費的數據結構是在開發階段就確定了,比如banner、feeds或者結構非常靈活的手填數據等。
在我們這個體系里,我們用一個 schema 描述資源位需要消費的數據結構。
這個 schema 是用 json 描述的。技術同學在前端頁面上開發實體資源位后,需要在我們的系統中創建對應的虛擬資源位,并通過一個圖形化的 json schema 編輯器來定義這個資源位需要消費的數據結構
投放物料
上述 schema 定義了一個資源位所需要消費的數據的格式。但是光有 schema 是不夠的,因為資源位要消費的數據,而不是數據結構本身。在我們的系統中,我們用一個動態表單模塊根據schema生成動態的表單,產品運營同學通過動態表單生產的數據,我們稱之為投放物料。資源位消費的就是投放物料。
對于一些手填數據,表單直接產生的數據就是資源位可用的了。但是對于 Feeds 之類的,表單往往只能定義 Feeds 的一些諸如選品等特征字段。對于這類特殊類型的數據源,服務端就不能簡單的直接返回數據了,需要根據這些特征字段,做一些數據查詢和數據解析工作,再返回給前端一個完整規范的數據。
投放單元
前述文章說到,同一個banner,可能對新用戶投放的是紅包,對年輕男孩子投放的是手機數碼內容,對年輕女孩子投放的是美妝服飾。我們把這個連接了資源位、投放物料與多個投放因子的橋梁叫做投放單元。
那么投放單元需要有多少個投放因子呢?其實是視業務而定的,我們認為基礎的投放因為應該包含 投放時段、投放人群、投放平臺、投放AB配置等。
當資源位向投放系統發起請求拉取數據時,投放系統在這個資源位上掛載的所有投放單元中根據投放因子篩選出命中的投放單元,最后將命中的投放單元上掛載的投放物料返回給前端的投放資源位。當命中了多個投放單元時,需要有些方法來裁決出最終勝出的那一個。這個方法簡單點做,可以在投放單元中配一個權重,篩選時最后選擇權重高的那個,也可以引入算法決策,根據投放的 ctr 數據做排序。
投放計劃
投放計劃是產品運營對多個資源位管理形式。簡單來說,一個投放計劃下,可以掛載多個關聯的資源位。試想一下,一次大促活動可能涉及到幾十個資源位的投放,將這些資源位組織到同一個投放計劃中進行管理,可以更加方便操作以及查看投放效果。
端側接入
對于前端來說,我們希望通過提供一個封裝的npm包,通過簡單調用,傳入resourceId(資源位ID) 即可獲取數據。
這種調用方式對業務調用方來說是比較優雅的,但是對頁面性能來說卻是不省心的。因為一個頁面往往由很多個資源位組成,每個資源位單獨發起請求就會形成大量的并發請求,不僅頁面性能會降低,還會對服務器產生比較大的qps壓力。
針對這種情況,我們做了一個小優化。服務端提供一個批量查詢的接口,前端SDK內部,每10ms 對模塊的請求調用做一次聚合,將單個資源位的數據獲取轉化成批量的查詢。負面影響是對部分資源位的數據加載造成最大10ms的延時,優點是提升了頁面整體的性能,有效減小了服務端QPS壓力。
效果
上述投放系統在我們的拉新業務實踐中run得非常好,已為閑魚應用內的數百個資源位提供投放能力支持,每天服務數以千萬記的閑魚用戶。既實現了資源位的精細化投放,提高了單個資源位的利用率,又賦能運營更自由地進行各種拉新投放實驗,減小試錯成本,還減少了技術同學頻繁參與運營實驗改造的開發工作量,解放了技術同學的生產力。
總結
上述文章介紹了一個簡易的投放系統的設計思路,本質上是一個連接前端實體資源位和服務端多種數據源的橋梁的設計。
其中有很多能力是依賴了團隊內部其它同學努力的成果,比如:
 1、描述資源位數據結構的 json schema如何設計
 2、根據json schema動態生成的表單怎么實現
 3、人群校驗的服務和能力
 4、AB測試的能力
 5、feeds 的選品服務
 4、個性化動態banner能力
還有很多可以優化的點,比如數據回流如何做得更好,怎樣引入算法能力對策略篩選進行優化。。。持續優化、持續為業務創造價值是我們一直堅持努力的方向。
原文鏈接
 本文為云棲社區原創內容,未經允許不得轉載。
總結
以上是生活随笔為你收集整理的揭秘!闲鱼拉新投放系统如何设计的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 每秒7亿次请求,阿里新一代数据库如何支撑
- 下一篇: 给软件工程师、数据科学家和数据工程师的面
