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