在互聯(lián)網(wǎng)江湖中,始終流傳著三大賺錢法寶:廣告、游戲、電商。三杰之中,又以大哥廣告的歷史最為悠久,地位也最為不可撼動。君不見很多電商和游戲公司,也通過廣告業(yè)務(wù)賺的盆滿缽滿。其發(fā)跡于Y公司,被G公司發(fā)揚光大,又在F公司階段性地完成了其歷史使命。F公司,在移動互聯(lián)網(wǎng)興起之際,利用其得天獨厚的數(shù)據(jù)優(yōu)勢,終于能夠回答困擾了廣告主幾百年的問題:我的廣告究竟被誰看到了?浪費的一半的錢到底去了哪里?
從用戶角度來看,廣告其實是充斥著互聯(lián)網(wǎng)的每個角落,但正如習(xí)慣成自然一樣,對于越常見的事物,越少有人究其根本。對于互聯(lián)網(wǎng)技術(shù)人員來說,由于廣告業(yè)務(wù)具有高度的壟斷性,能夠接觸到其本質(zhì)的工程師相對較少,尤其有過大型系統(tǒng)經(jīng)驗的人更加稀缺。本文的目的在于對大型廣告系統(tǒng)的整體架構(gòu)和其中的設(shè)計權(quán)衡點有一個全面的介紹,為有志從事該行業(yè)的工程師提供一套思考的思路。
另外有幾點說明。第一,廣告系統(tǒng)一般分為搜索廣告和上下文廣告,由于上下文廣告系統(tǒng)面臨的問題要比搜索廣告系統(tǒng)更加豐富,因此本文專注于討論上下文廣告系統(tǒng)。第二,本文適合對廣告業(yè)務(wù)有一定了解的工程師,對于業(yè)務(wù)不了解的同學(xué),推薦閱讀劉鵬博士的<<計算廣告>>。
俗話說,離開業(yè)務(wù)談架構(gòu)都是耍流氓。用一句標(biāo)準(zhǔn)的報告性語言介紹大型廣告系統(tǒng)的特點就是:處理的數(shù)據(jù)量特別巨大,響應(yīng)速度要求特別快,數(shù)據(jù)實時性要求特別高,系統(tǒng)可用性要求特別高。面對種種不可思議的困難,最初的一批誤打誤撞進(jìn)入廣告行業(yè)的的互聯(lián)網(wǎng)工程師們,本著賺錢的目的,通過演雜技一般的對各種技術(shù)的拼接,出色地完成了任務(wù)。下面逐條分析一下系統(tǒng)特點。
一、數(shù)據(jù)量特別巨大
在上下文廣告中,系統(tǒng)中一般主要包含四種數(shù)據(jù)(廣告系統(tǒng)所有問題的討論一般都圍繞這四種數(shù)據(jù)展開)
- 廣告本身的數(shù)據(jù)
一般包括名字、出價、投放時間、有效性(預(yù)算)、標(biāo)題、描述、跳轉(zhuǎn)鏈接、圖片、視頻等。這里的數(shù)據(jù)量一般不會特別巨大。幾十萬的廣告主,已經(jīng)足以支撐起業(yè)內(nèi)頂尖的廣告公司,廣告的數(shù)量會比廣告主的數(shù)量大2個數(shù)量級左右。
- 廣告的定向數(shù)據(jù)
其數(shù)據(jù)量和系統(tǒng)提供的定向維度有關(guān)。例如用戶的搜索記錄定向,網(wǎng)頁分詞定向,購買的商品記錄定向,APP安裝列表定向,用戶人群定向等。其中每一種定向維度中,廣告主都可以設(shè)置大量的定向數(shù)據(jù)。例如搜索記錄定向中,廣告+關(guān)鍵詞的組合個數(shù)甚至?xí)^int最大值,如果在內(nèi)存中高效地組織這些數(shù)據(jù),是一個挑戰(zhàn)。
插一條案例。在團(tuán)購大戰(zhàn)時代,某美國團(tuán)購鼻祖高調(diào)殺入中國,曾經(jīng)創(chuàng)下過購買百萬級關(guān)鍵詞的記錄,當(dāng)然最后被中國的資本市場實實在在地教訓(xùn)了一把,結(jié)果大家都知道。類似的不理智行為還曾發(fā)生在視頻大戰(zhàn)、電商大戰(zhàn)、分類信息網(wǎng)站大戰(zhàn),最終要么合并,要么抱大腿,唯留得廣告公司內(nèi)心竊喜,期待下一場大戰(zhàn)爆發(fā)。
- 用戶的特征數(shù)據(jù)
其數(shù)據(jù)量和面向的市場有關(guān)。如果面向的是中國市場,那么就要做好處理世界上最復(fù)雜問題的準(zhǔn)備(下一個這樣體量的市場是印度)。君不見各家PR稿,沒有3億用戶都不好意思出來打招呼,且不說數(shù)據(jù)量是真是假以及是否有用,起碼這表明了大家都認(rèn)可“用戶數(shù)量是衡量廣告系統(tǒng)優(yōu)劣的一大標(biāo)準(zhǔn)”。進(jìn)一步說,特征數(shù)據(jù)是根據(jù)用戶的行為數(shù)據(jù)計算出來的(例如瀏覽過哪些頁面,購買過什么物品)。數(shù)億的用戶,一般都會用歷史一段時間的行為數(shù)據(jù)和當(dāng)天的行為數(shù)據(jù),計算出用戶的歷史特征和實時特征。注意,用戶的行為數(shù)據(jù)包括用戶在廣告系統(tǒng)內(nèi)部和外部兩種行為數(shù)據(jù)。用戶在廣告系統(tǒng)內(nèi)部的行為數(shù)據(jù)包括用戶看到廣告的展示、點擊廣告、以及發(fā)生轉(zhuǎn)化行為(CPA結(jié)算方式)等。用戶在廣告系統(tǒng)外部的行為數(shù)據(jù)包括網(wǎng)頁瀏覽記錄、交易記錄、APP使用記錄等??傮w數(shù)據(jù)量是TB級別,而且也涉及到大量的計算,如何高效地計算和存儲這些數(shù)據(jù),并且保證高效的查詢,是用戶數(shù)據(jù)處理的核心問題。當(dāng)然,用戶數(shù)據(jù)是需要實時更新的,如果保證實時性在下文中討論。
- 廣告展示環(huán)境的特征數(shù)據(jù)
展示環(huán)境一般分為網(wǎng)頁和APP。處理方法和用戶特征數(shù)據(jù)類似,區(qū)別在于量級更加大,涉及的運算更加多。試想,將中國所有(重要的)網(wǎng)站的頁面爬取下來并分詞,再從其中提取出頁面的特征信息,需要處理的數(shù)據(jù)量級有多少。同時,頁面可能會經(jīng)常變化,因此這項工作需要定期重做。這里存在著投入和產(chǎn)出的衡量,例如訪問量很小的網(wǎng)站就沒必要抓取;小說類網(wǎng)站頁面量巨大,但對廣告投放的指導(dǎo)性很差,也可以不抓??;但垂直類網(wǎng)站一般都包含了明確的定向信息,是處理的重點。
一般來說,用戶特征和廣告展示環(huán)境特征的數(shù)據(jù)會存儲在獨立的分布式集群中。數(shù)據(jù)存儲在內(nèi)存和磁盤兩級,內(nèi)存中存放熱點數(shù)據(jù),磁盤中存放全量數(shù)據(jù)。同時,內(nèi)存中的數(shù)據(jù)包括歷史數(shù)據(jù)和實時數(shù)據(jù)兩部分,實時數(shù)據(jù)流會更新實時數(shù)據(jù),在查詢的時候,集群負(fù)責(zé)同時查歷史和實時兩份數(shù)據(jù),合并后將結(jié)果返回。
廣告數(shù)據(jù)和廣告的定向數(shù)據(jù)一般存儲在檢索服務(wù)內(nèi)部,在初期都是全內(nèi)存的數(shù)據(jù)結(jié)構(gòu)。當(dāng)數(shù)據(jù)逐漸增長,超出單機內(nèi)存存儲極限之后,可以先進(jìn)行水平拆分,即多個檢索服務(wù)器組成一個分組,一個分組維護(hù)全庫數(shù)據(jù),在查詢時同時查詢一個分組內(nèi)的每臺機器,由上游機器對結(jié)果做合并。再進(jìn)一步,因為并不是所有數(shù)據(jù)都可以進(jìn)行拆分,數(shù)據(jù)仍然可能超出單機存儲極限,這時可以采用內(nèi)存-磁盤兩級存儲的結(jié)構(gòu),也可以拆分出單獨的服務(wù)。由于廣告系統(tǒng)一般都存在熱點數(shù)據(jù),因此內(nèi)存-磁盤兩級存儲是優(yōu)先的考慮方案。同時,仔細(xì)地設(shè)計內(nèi)存中的數(shù)據(jù)結(jié)構(gòu),高效地建立索引,能帶來巨大的收益。
一般系統(tǒng)使用的存儲結(jié)構(gòu)是B+樹,如果使用不當(dāng)會造成內(nèi)存的巨大浪費,在后續(xù)的文章中會有專門的篇幅討論這個問題
二、響應(yīng)速度要求特別快
這一點毋庸置疑,廣告對于網(wǎng)站或者APP是附加功能,只能比內(nèi)容更快地展現(xiàn)給用戶。同時,一些特定的廣告形式對用戶有跳出感,例如開屏、插屏廣告,對響應(yīng)時間要求更加短。另外,在RTB系統(tǒng)中,由于exchange的存在,增加了一次網(wǎng)絡(luò)請求,DSP系統(tǒng)的響應(yīng)時間就要更加短。一般來說,一次對廣告系統(tǒng)的請求必須在100ms以內(nèi)完成。其中60%-70%的時間消耗在網(wǎng)絡(luò)中,另外的部分是主要消耗在核心檢索模塊中。
網(wǎng)絡(luò)包括媒體和廣告系統(tǒng)之間的網(wǎng)絡(luò),和廣告系統(tǒng)各模塊之間的網(wǎng)絡(luò)交互。在設(shè)計架構(gòu)時,既要保持系統(tǒng)一定的可擴(kuò)展性和可伸縮性,也要考慮盡可能地減少內(nèi)部網(wǎng)絡(luò)請求次數(shù)。同時,在設(shè)計和選擇RPC框架時,要充分考慮QPS,latency,請求長度三個因素。
核心檢索模塊中,一次請求會觸發(fā)多個定向策略同時檢索,因此索引數(shù)據(jù)設(shè)計的是否高效是決定檢索性性能的核心要素。因為大量的查詢操作,CPU往往會成為檢索系統(tǒng)的瓶頸,所以很多檢索模塊的QPS并不高。在實戰(zhàn)中,對索引的使用不當(dāng)也會造成性能的下降,因此需要工程能力比較強的人做 code review 把關(guān)。
三、實時性要求特別高
實時性是指數(shù)據(jù)更新的實時性。下面逐條討論。
- 廣告數(shù)據(jù)的實時性
這里最頻繁變化的是廣告有效性和出價。例如,廣告必須在廣告主指定的時間段內(nèi)投放,時間變化時,必須及時上下線。廣告主出價發(fā)生變化時,必須立即反饋到系統(tǒng)中。廣告預(yù)算消費完畢后,必須立即將廣告下線。
以CPC系統(tǒng)為例,曾經(jīng)有很長一段時間,很多廣告主利用廣告系統(tǒng)計費的延遲性騙取大量的點擊。例如,給廣告設(shè)定一個很小的預(yù)算(可能只夠一次點擊),實際產(chǎn)生點擊和檢索系統(tǒng)接收到計費數(shù)據(jù)之間,可能會有分鐘級的延遲,這期間發(fā)生的其他點擊,產(chǎn)生的費用廣告主就無需支付。
- 廣告定向數(shù)據(jù)的實時性
與廣告數(shù)據(jù)類似,不展開討論。
- 用戶特征數(shù)據(jù)的實時性
用戶特征數(shù)據(jù)往往是根據(jù)用戶的歷史行為計算出的一些興趣點數(shù)據(jù),在起初對實時性的要求并不是很高,主要是因為用戶的興趣點形成往往是一個長期過程,并且變化很平緩。例如,喜歡足球的用戶可能每天都會看一下體育新聞的足球頁面,餐飲、母嬰、裝修、軍事等垂直領(lǐng)域的用戶,也會長期關(guān)注相關(guān)網(wǎng)站。然而隨著電商的興起,以及移動互聯(lián)網(wǎng)將時間更加碎片化,用戶的興趣點轉(zhuǎn)移變得非常快。例如,某用戶最近對相機比較感興趣,在某電商網(wǎng)站瀏覽了10分鐘相機產(chǎn)品后離開,打開門戶網(wǎng)站開始瀏覽新聞,這時如果出現(xiàn)了相機廣告,將很可能引起轉(zhuǎn)化,這其實是電商類廣告最有效的定向方式——retargeting。當(dāng)然,這只是為了說明實時性的重要程度而舉的一個非常粗淺的例子,其中有很多細(xì)節(jié)有待考量。例如用戶如果發(fā)生了購買行為之后,顯然不應(yīng)該再推送相機廣告。有些快消類產(chǎn)品,重復(fù)購買率高,可以定期給用戶推薦,但類似相機、汽車、房產(chǎn)等大宗商品,在用戶發(fā)生購買后,顯然不應(yīng)該再繼續(xù)投放,而應(yīng)該投放與此相關(guān)的其他廣告。在策略處理上,對不同類型的興趣點的時效性應(yīng)該區(qū)別對待。
另外,在RTB系統(tǒng)中,這一點尤為重要。試想相機的例子,當(dāng)用戶已經(jīng)發(fā)生購買之后,DSP如果沒有識別出該行為,認(rèn)為用戶仍然具有該興趣點,繼續(xù)出高價購買流量,顯然是收益極低甚至可能虧損的。
- 廣告展示環(huán)境的特征數(shù)據(jù)的實時性
網(wǎng)頁和APP的內(nèi)容一般不經(jīng)常發(fā)生變化,抓取一次可以在很長一段時間內(nèi)是有效的。比較特殊的是新頁面,尤其是內(nèi)容類網(wǎng)站(例如旅游攻略,實時新聞),每天會產(chǎn)生大量的新頁面,如果不能及時抓取,在廣告投放過程中就無法利用廣告展示環(huán)境的數(shù)據(jù)。尤其在移動端,用戶的場景化更加強烈,在未來場景定向的重要程度很可能會超過用戶定向。在傳統(tǒng)的PC廣告系統(tǒng)中,一般是將網(wǎng)站分級,優(yōu)先級越高的網(wǎng)站爬去的頻率越高,甚至是API對接。在移動端,有一種方案是在請求中帶入網(wǎng)頁的重要特征,例如標(biāo)題、重要關(guān)鍵詞等,這需要媒體的支持,廣泛使用還有待時日。另外,實戰(zhàn)中還往往采用 near line 的設(shè)計模型,即當(dāng)發(fā)現(xiàn)請求中出現(xiàn)了新的頁面,實時通知爬蟲立即爬去并分析,在處理后續(xù)的請求中使用。
用戶特征數(shù)據(jù)和網(wǎng)頁/APP的特征數(shù)據(jù)往往數(shù)據(jù)量巨大,為了能夠高效地利用內(nèi)存,存儲這些數(shù)據(jù)的緩存集群往往使用了只能提供讀取功能的數(shù)據(jù)結(jié)構(gòu)。因此,一般是將歷史的特征和實時的特征分開存儲在不同的數(shù)據(jù)結(jié)構(gòu)中,實時的特征可以隨時更新,只存儲當(dāng)天數(shù)據(jù),在查詢時,同時查詢兩個數(shù)據(jù)結(jié)構(gòu),將結(jié)果合并后返回。
四、系統(tǒng)可用性要求特別高
這一點比較容易理解,分分鐘都是錢,所以廣告系統(tǒng)一般都有大量的熱備冗余機器,部署在多地多個機房。除了常見的分布式系統(tǒng)高可用方案之外,廣告系統(tǒng)還有如下兩個重要的方案。
- 自動降級
由于上文討論的實時性問題,廣告系統(tǒng)很難像傳統(tǒng)用戶類網(wǎng)站一樣,提供一些靜態(tài)的只讀內(nèi)容,以備在集群全體宕機的時候使用。但在系統(tǒng)內(nèi)部設(shè)計中,可以做到模塊級別的容災(zāi),系統(tǒng)化點的稱為叫自動降級。即當(dāng)某些模塊出現(xiàn)問題的時候,或者系統(tǒng)資源不夠用的時候,系統(tǒng)能夠自動地移除出問題的模塊,或者非核心模塊,保證基本功能可用。比較典型的例子是,如果某一種策略的計算邏輯出現(xiàn)問題,或者CTR預(yù)估集群整體宕機,系統(tǒng)還能夠正常返回廣告,只是收益不如原來高。當(dāng)然,自動降級只是一種防御手段,當(dāng)發(fā)生這種情況的時候,應(yīng)該視為線上集群整體宕機同等嚴(yán)重的事故,必須第一時間處理。例外的情況是自動降級是人為預(yù)期的,例如有些業(yè)務(wù)激增場景一年只發(fā)生一次,公司不可能為此常年準(zhǔn)備大量機器,此時也可以用自動降級的手段保證業(yè)務(wù)基本可用。
- 減少啟動時間
前文提到,大型廣告系統(tǒng)使用的數(shù)據(jù)量甚至?xí)^單機內(nèi)存極限,這時系統(tǒng)的啟動時間會非??捎^。例如筆者曾經(jīng)開發(fā)過的廣告系統(tǒng),即使進(jìn)行了水平拆庫,單機使用內(nèi)存仍然達(dá)到50G以上,啟動時間在30分鐘左右,經(jīng)過后續(xù)的優(yōu)化減少到15分鐘。減少啟動時間,主要好處有兩個:減少運維成本,減少容災(zāi)成本。
減少運維成本。和其他互聯(lián)網(wǎng)系統(tǒng)一樣,廣告系統(tǒng)也會采用快速迭代的上線方案。有幾千臺服務(wù)器的廣告系統(tǒng),可能會一周多次上線。上線時,為了使服務(wù)仍然可用,會分批操作,例如一次只操作5%的機器。這對運維人員是非常痛苦的一個過程。例如1000臺機器,每次操作5%,每臺機器啟動時間在30分鐘,整體上線流程將達(dá)到10小時,這樣的事情每周發(fā)生幾次,顯然是無法接受的。當(dāng)然,可以選擇流量低谷的時間段上線,增加每次操作的機器數(shù)量,這樣又引入了運維成本。因此減少系統(tǒng)啟動時間意義重大。
減少容災(zāi)成本。很長的啟動時間,會使系統(tǒng)在請求量激增的情況下無法及時使用冷備機器擴(kuò)容,而增加很多熱備機器,第一會增加成本,第二實際情況還是可能會超出預(yù)留。而且,當(dāng)熱備機器也難以處理所有請求時,很可能會導(dǎo)致剛剛啟動完畢的機器也被打滿而無法正常提供服務(wù),觸發(fā)雪崩效應(yīng)。此時,必須切斷所有服務(wù),重啟集群,等所有服務(wù)都重啟并檢驗數(shù)據(jù)完畢后,才能開始對外提供服務(wù)。一般來說,當(dāng)我們聽說一些大型網(wǎng)站發(fā)生整體宕機,若干小時后才恢復(fù),很可能都是發(fā)生了雪崩事故。
據(jù)說,歷史上某E字輩美國購物網(wǎng)站曾經(jīng)發(fā)生過一次這樣的案例,導(dǎo)致整體服務(wù)宕機8小時。近兩年Amazon的公開的幾次事故恢復(fù)時間也都在小時甚至天級別,都和復(fù)雜的啟動流程有關(guān)。
作為大型廣告系統(tǒng)架構(gòu)的開篇,本文主要闡述了大型廣告系統(tǒng)面臨的核心問題的業(yè)務(wù)來源、處理方案、以及選擇方案的時候考慮的一些權(quán)衡點。在接下來的文章中,會深入每個模塊,詳細(xì)地討論技術(shù)細(xì)節(jié)。下一篇會重點討論檢索模塊,歡迎關(guān)注。