WOT2016歐陽(yáng)辰:小米程序化廣告交易平臺(tái)(MAX)的架構(gòu)實(shí)踐
原創(chuàng)【51CTO.com原創(chuàng)稿件】WOT2016大數(shù)據(jù)峰會(huì)將于2016年11月25-26日在北京粵財(cái)JW萬(wàn)豪酒店召開(kāi),屆時(shí),數(shù)十位大數(shù)據(jù)領(lǐng)域一線專(zhuān)家、數(shù)據(jù)技術(shù)先行者將齊聚現(xiàn)場(chǎng),在圍繞機(jī)器學(xué)習(xí)、實(shí)時(shí)計(jì)算、系統(tǒng)架構(gòu)、NoSQL技術(shù)實(shí)踐等前沿技術(shù)話(huà)題展開(kāi)深度交流和溝通探討的同時(shí),分享大數(shù)據(jù)領(lǐng)域***實(shí)踐和最熱門(mén)的行業(yè)應(yīng)用。
51CTO記者在會(huì)前采訪了小米公司研發(fā)總監(jiān)歐陽(yáng)辰,他是小米公司MIUI商業(yè)產(chǎn)品部的架構(gòu)師和研發(fā)主管,是此次WOT2016大數(shù)據(jù)峰會(huì)重要演講嘉賓之一。他的演講主題是小米程序化廣告交易平臺(tái)(MAX)的架構(gòu)實(shí)踐。
【受訪人簡(jiǎn)介】
歐陽(yáng)辰·小米公司研發(fā)總監(jiān)
歐陽(yáng)辰,目前就職小米公司MIUI商業(yè)產(chǎn)品部,擔(dān)任架構(gòu)師和研發(fā)主管,主要負(fù)責(zé)廣告平臺(tái)系統(tǒng)架構(gòu),廣告交易系統(tǒng)研發(fā)和數(shù)據(jù)平臺(tái)。之前在微軟工作10年,帶領(lǐng)團(tuán)隊(duì)從事互聯(lián)網(wǎng)廣告和搜索引擎的研發(fā)工作,包括負(fù)責(zé)微軟移動(dòng)上下文廣告系統(tǒng)和數(shù)據(jù)算法,必應(yīng)搜索引擎的Index Serve的性能提升,最早在甲骨文公司從事數(shù)據(jù)庫(kù)的研發(fā)工作。
當(dāng)問(wèn)及所處團(tuán)隊(duì)當(dāng)前的規(guī)模和業(yè)務(wù)劃分情況,歐陽(yáng)老師這樣說(shuō):“小米商業(yè)產(chǎn)品部目前是百余人的規(guī)模,其中大部分為技術(shù)人員,整體團(tuán)隊(duì)還在不斷增長(zhǎng),不斷有廣告行業(yè)技術(shù)專(zhuān)家加入我們。研發(fā)部門(mén)按業(yè)務(wù)目標(biāo)劃分,可分為媒體方、系統(tǒng)架構(gòu)、策略算法、廣告主服務(wù)和數(shù)據(jù)平臺(tái)。媒體方組負(fù)責(zé)媒體變現(xiàn)對(duì)接和用戶(hù)體驗(yàn),系統(tǒng)組負(fù)責(zé)架構(gòu)演化和可靠性,策略算法組負(fù)責(zé)點(diǎn)擊率預(yù)估、相關(guān)性等,廣告主服務(wù)負(fù)責(zé)提升廣告主滿(mǎn)意度和ROI,數(shù)據(jù)平臺(tái)提供數(shù)據(jù)洞察和營(yíng)銷(xiāo)數(shù)據(jù)平臺(tái)DMP”。
小米程序化廣告交易平臺(tái)(MAX)的架構(gòu)設(shè)計(jì)思路
關(guān)于架構(gòu)設(shè)計(jì)思路,歐陽(yáng)老師談到架構(gòu)設(shè)計(jì)本身就是一種學(xué)習(xí)和演化,踩坑踩多了,知道哪些地方不能走,也便成了思路。廣告平臺(tái)的設(shè)計(jì)思路是從幾個(gè)方面出發(fā):
首先是對(duì)于目前業(yè)務(wù)和未來(lái)業(yè)務(wù)的深刻理解,一直堅(jiān)信架構(gòu)是為現(xiàn)在和未來(lái)的業(yè)務(wù)服務(wù)的,減少業(yè)務(wù)變化而引入的成本,在設(shè)計(jì)理念上更愿意按照業(yè)務(wù)分解系統(tǒng),特別是將需求多變的業(yè)務(wù)模塊隔離出來(lái),減少耦合。
其次,架構(gòu)設(shè)計(jì)需要和團(tuán)隊(duì)的組織方式是一致的,遵守康威法則,例如在平臺(tái)建設(shè)初期,各個(gè)業(yè)務(wù)小組都飛速發(fā)展,放馬狂飆,那么架構(gòu)需要提供足夠的靈活性。
另外,廣告系統(tǒng)對(duì)于可靠性要求非常高,不僅僅涉及到用戶(hù)體驗(yàn),也涉及到業(yè)務(wù)收入,因此系統(tǒng)的預(yù)警,報(bào)警和錯(cuò)誤排除都需要大力投入。廣告系統(tǒng)也有業(yè)務(wù)驅(qū)動(dòng)的特點(diǎn),不同的廣告業(yè)務(wù)可能需要不同的系統(tǒng)架構(gòu)來(lái)支持,因此架構(gòu)的擴(kuò)展性和可演化性也是非常重要的,需要支持業(yè)務(wù)的小步快跑,敏捷式迭代。
小米程序化廣告交易平臺(tái)(MAX)的演化過(guò)程以及對(duì)應(yīng)業(yè)
歐陽(yáng)老師表示平臺(tái)架構(gòu)的過(guò)程實(shí)際上是一個(gè)演化的過(guò)程,每一步演化都是為業(yè)務(wù)服務(wù)的。其可以分為四個(gè)階段,分別是”加、減、乘、除”。
***個(gè)階段是加法,不斷的上線新業(yè)務(wù),整個(gè)系統(tǒng)不斷復(fù)雜化,結(jié)果造成各個(gè)業(yè)務(wù)之間耦合很厲害,在后期,每一次設(shè)計(jì)涉及的影響都很大。
第二個(gè)階段是減法,為了解決***階段的問(wèn)題,系統(tǒng)的解耦成是一項(xiàng)最重要的工作,將各個(gè)模塊獨(dú)立出來(lái),服務(wù)化,減少各個(gè)模塊之間的不必要的聯(lián)系。
第三個(gè)階段是“乘法”,這一階段的業(yè)務(wù)發(fā)展脈路較為穩(wěn)定,各個(gè)模塊分解的比較合適,各個(gè)模塊(服務(wù))都可以利用各種技術(shù),高速提高服務(wù)質(zhì)量,例如數(shù)據(jù)處理方面,通過(guò)流式處理,大大提高及時(shí)性;算法模塊在解耦后,也大大提高了算法上線的速度和種類(lèi);架構(gòu)服務(wù)化后,系統(tǒng)的容量和可靠性也大大提高。
***一個(gè)階段是“除法”,整個(gè)系統(tǒng)變得非常大且復(fù)雜,開(kāi)發(fā)人員也有近5倍的增長(zhǎng),部署的機(jī)器也有近10倍的增長(zhǎng),服務(wù)模塊數(shù)量也超過(guò)20個(gè),這時(shí)候架構(gòu)的調(diào)整涉及到一些抽象,按照業(yè)務(wù)分為服務(wù)群,對(duì)于離線的數(shù)據(jù)流也進(jìn)行了大規(guī)模的優(yōu)化,整合了一些分散的小模塊,使得整個(gè)系統(tǒng)更加簡(jiǎn)單。
值得分享的經(jīng)驗(yàn)是,架構(gòu)師的工作不是創(chuàng)建一個(gè)靜態(tài)的,美麗的架構(gòu)藍(lán)圖,更多的工作是在成本、質(zhì)量、收益和速度中找到長(zhǎng)期技術(shù)投入的平衡,其目標(biāo)是支持業(yè)務(wù)的快速發(fā)展。
研發(fā)過(guò)程中遇到的問(wèn)題及經(jīng)驗(yàn)教訓(xùn)
談到經(jīng)驗(yàn)教訓(xùn),歐陽(yáng)老實(shí)說(shuō)開(kāi)發(fā)過(guò)程中踩坑是不可避免的,關(guān)鍵是能從踩坑中吸取教訓(xùn),不要第二次踩到同一個(gè)坑。架構(gòu)設(shè)計(jì)上,其個(gè)人收獲到很重要一點(diǎn)就是:架構(gòu)及演化一定要堅(jiān)持為業(yè)務(wù)服務(wù)。這部分,他舉了兩個(gè)例子:
其一:一年前剛剛接觸這個(gè)平臺(tái)時(shí),當(dāng)時(shí)感覺(jué)平臺(tái)的層次不清楚,各業(yè)務(wù)之間的重復(fù)性很高,很多代碼不忍直視,我的***個(gè)直覺(jué)就是需要一個(gè)周全的架構(gòu),統(tǒng)一化的廣告檢索,可擴(kuò)展的廣告檢索元語(yǔ)言等,基于這些想法和過(guò)去多個(gè)廣告平臺(tái)的經(jīng)驗(yàn),設(shè)計(jì)了一個(gè)廣告演化的目標(biāo)架構(gòu)(所謂藍(lán)圖),有些模塊沿著這個(gè)思路開(kāi)始了重構(gòu)工作,有些模塊并沒(méi)有重構(gòu),沿著老路發(fā)展,半年以后,我們?cè)倩厥桩?dāng)時(shí)的決定。當(dāng)時(shí)重構(gòu)的模塊是業(yè)務(wù)相對(duì)穩(wěn)定的模塊,后期的業(yè)務(wù)并沒(méi)有從其中得到太多直接好處,雖然代碼很整齊,設(shè)計(jì)很規(guī)范,但是投入和產(chǎn)出比很低; 對(duì)于沒(méi)有重構(gòu)的一些模塊,在各個(gè)新業(yè)務(wù)的沖擊,打磨和碰撞下,不斷的進(jìn)行自然演化,反而成為最適宜業(yè)務(wù)變化的模塊,回想過(guò)來(lái),其中的很多設(shè)計(jì)都不是當(dāng)初能夠規(guī)劃出來(lái)的,因?yàn)楹芏嘈聵I(yè)務(wù)都未到位。
其二:關(guān)于MySQL的,在項(xiàng)目初期使用MySQL一直很順利,讀訪問(wèn)量大了,就采用、讀寫(xiě)分離;寫(xiě)訪問(wèn)量大了,就進(jìn)行垂直拆庫(kù)(分表);數(shù)據(jù)量繼續(xù)增長(zhǎng),然后進(jìn)行水平拆庫(kù)、水平擴(kuò)展、引入代理層;然后數(shù)據(jù)量又長(zhǎng)大了,不得不將部分?jǐn)?shù)據(jù)移植到HBase里去。整個(gè)過(guò)程中,我們?cè)贛ySQL折騰了太多的時(shí)間,每一次數(shù)據(jù)庫(kù)改進(jìn)都需要花不少人力,而且容易出錯(cuò),每次的工作成果只能維持很短的一段時(shí)間,總結(jié)出一個(gè)簡(jiǎn)單道理, 如果有機(jī)會(huì)再重新做一次,我會(huì)更早的擁抱NoSQL的解決方案,避免在MySQL上很多無(wú)謂的投入 。
開(kāi)發(fā)和設(shè)計(jì)“老司機(jī)”給入行新手的忠告
每個(gè)人都是從新手成長(zhǎng)起來(lái)的,新手往往是潛力無(wú)窮的。我有幾點(diǎn)小建議,也是我成長(zhǎng)過(guò)程中,在多次經(jīng)歷迷惑后的一些體會(huì)。首先,要學(xué)會(huì)確定自己想去的方向,確定自己想成為架構(gòu)師還是某個(gè)領(lǐng)域?qū)<遥坏┐_定目標(biāo)了就可以多向周邊的大牛學(xué)習(xí),看看優(yōu)秀的同事都是如何思考問(wèn)題的。 第二,保持學(xué)習(xí)的熱情,計(jì)算機(jī)行業(yè)新技術(shù)層出不窮,需要不斷的充電,了解***的技術(shù)動(dòng)態(tài)。第三,在學(xué)習(xí)過(guò)程中,要坐的住冷板凳,學(xué)會(huì)漁而非魚(yú),對(duì)于每種新技術(shù),每一類(lèi)問(wèn)題,都會(huì)有學(xué)習(xí)的曲線,往往需要經(jīng)歷過(guò)一段黑暗的曲線,堅(jiān)持下去就是光明。另外,在解決問(wèn)題的時(shí)候,盡量了解問(wèn)題的原理,把問(wèn)題想透,學(xué)會(huì)刨根問(wèn)底的思考。
***,也祝愿剛?cè)腴T(mén)的新手能夠享受計(jì)算機(jī)技術(shù)的歡樂(lè)和痛苦,這是一條長(zhǎng)長(zhǎng)的路,道長(zhǎng)且阻,行則將至,加油!
【51CTO原創(chuàng)稿件,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文作者和出處為51CTO.com】