亞太內(nèi)容分發(fā)大會是亞太CDN產(chǎn)業(yè)聯(lián)盟舉辦的CDN領(lǐng)域千人科技會議,是全球內(nèi)容流量技術(shù)和運維領(lǐng)域最重要、規(guī)模最大的活動之一。大會目標(biāo)是推動內(nèi)容分發(fā)平臺CDN節(jié)點部署,技術(shù)創(chuàng)新和流量成本降低。目標(biāo)聽眾是流量內(nèi)容平臺的CTO、運維總監(jiān)和運維經(jīng)理,通過向大會聽眾和讀者普及CDN行業(yè)技術(shù)創(chuàng)新,來推動企業(yè)內(nèi)容平臺的技術(shù)運維,適應(yīng)創(chuàng)新的流量技術(shù)和價格體系。
6月9日,“新十年 無畏前行”2021亞太內(nèi)容分發(fā)大會暨CDN峰會在北京盛大開幕,亞太CDN產(chǎn)業(yè)聯(lián)盟聯(lián)合來自中國移動、阿里云、騰訊云、網(wǎng)宿科技、安邁云、中興通訊等中國CDN產(chǎn)業(yè)生態(tài)圈頂層企業(yè)國內(nèi)內(nèi)容分發(fā)網(wǎng)絡(luò)生態(tài)的頂尖技術(shù)專家、知名企業(yè)領(lǐng)袖、數(shù)字營銷專家,攜高尖端技術(shù)、優(yōu)秀實踐案例、未來趨勢洞悉等高質(zhì)量硬核內(nèi)容悉數(shù)亮相,共同打造具備里程碑意義的內(nèi)容分發(fā)網(wǎng)絡(luò)盛會,面向新十年,無畏前行,擴張CDN產(chǎn)業(yè)覆蓋,推動CDN與RTC互動直播、PCDN邊緣計算、內(nèi)容出海、對象存儲、運營商5G等領(lǐng)域融合、創(chuàng)新與升級,賦予CDN全新價值!
在6月9日下午舉辦的【邊緣加速論壇論壇】上,芒果TV后端研發(fā)工程師易桂帶來了以《在微服務(wù)下基于GraphQL構(gòu)建通用一層》為題的主題演講。本次大會上,芒果TV榮膺亞太內(nèi)容分發(fā)大會CDN運營領(lǐng)袖獎。
演講開始,易桂感慨道:“時隔5年后來到曾經(jīng)奮斗過的北京,日新月異的技術(shù)發(fā)展,讓我有著許多的感慨。最令人興奮的是酒店里已經(jīng)配有智能機器人可以乘坐電梯為客人提供專業(yè)服務(wù)了,這是技術(shù)人不斷努力的結(jié)果。CDN同樣如此,技術(shù)的不斷創(chuàng)新、升級、超越、突破,終使其在互聯(lián)網(wǎng)上書寫了濃墨重彩的一筆。”
易桂介紹,芒果TV是以視聽互動為核心,融網(wǎng)絡(luò)特色與電視特色于一體,實現(xiàn)“多屏合一”獨播、跨屏、自制的新媒體視聽綜合傳播服務(wù)平臺,同時也是湖南廣電旗下唯一互聯(lián)網(wǎng)視頻平臺,提供湖南衛(wèi)視電視欄目高清視頻點播服務(wù),并同步推送熱門電視劇、電影、綜藝和音樂視頻等內(nèi)容,以及部分電視臺網(wǎng)絡(luò)同步直播。作為芒果TV負責(zé)點、直播一層后端服務(wù)的技術(shù)人員,面對最核心業(yè)務(wù),是如何做技術(shù)的創(chuàng)新升級的呢?
對此,易桂分為四點為大家進行了具體介紹。
首先是對芒果TV的播放一層業(yè)務(wù)和技術(shù)架構(gòu)的發(fā)展,易桂介紹了播放一層的前世今生。播放一層負責(zé)客戶端點、直播功能的后端業(yè)務(wù)邏輯,是直接面向終端的,所以叫我們一層。芒果TV從最開始的PcWeb端,逐步發(fā)展為擁有M站、手機、Pad等客戶端,由于我們早期是按照終端來做產(chǎn)品的,這也間接決定了播放一層之前的架構(gòu)如此。各個終端發(fā)起http請求到自己對應(yīng)的播放一層,各端播放一層再請求下游http服務(wù)接口獲取數(shù)據(jù),進行業(yè)務(wù)邏輯處理。各端播放一層都包含播放的全部業(yè)務(wù),且各端播放業(yè)務(wù)大體相似,抽象的說有取串、播放頁信息、諸多列表和很多配置接口。
此架構(gòu)的優(yōu)點有包括以下幾點:一是開發(fā)簡潔,功能都在各個終端的播放一層內(nèi)部,便于軟件設(shè)計和開發(fā)規(guī)劃;二是容易測試,核心業(yè)務(wù)沒有復(fù)雜的服務(wù)調(diào)用關(guān)系,都是內(nèi)部調(diào)用,方便測試;三是容易運維,各個終端獨立部署,互相隔離。不存在分布式集群的復(fù)雜部署環(huán)境,降低了部署難度。
而隨著業(yè)務(wù)的發(fā)展,工作模式發(fā)生了變化。由按終端來做產(chǎn)品變?yōu)榻y(tǒng)一做產(chǎn)品和業(yè)務(wù),只是終端的承載方式不同。播放一層老的技術(shù)架構(gòu)漸漸暴露出一些問題。“首先由于播放一層包含有復(fù)雜的業(yè)務(wù)邏輯,在終端、播放一層和服務(wù)層職責(zé)劃分不清楚的情況下,小需求的修改,需要牽動終端、播放一層和服務(wù)層三方。其次,全端的相同需求,相同業(yè)務(wù)邏輯需要在各個終端的播放一層實現(xiàn)一遍,產(chǎn)生大量的重復(fù)代碼。
因此面對這些問題急需改變,BFF架構(gòu)開始實施,甚至向著越來越先進的CBA技術(shù)發(fā)展。這就是我們的第二部分內(nèi)容——BFF架構(gòu)。”易桂說。
那么,要解決播放一層的問題,芒果TV希望BFF架構(gòu)做到以下幾點。首先是明確定位,明確終端、播放一層和服務(wù)層的職責(zé),最主要是搞清楚中間層:播放一層的定位。其次是終端適配,需要一種方便、標(biāo)準(zhǔn)的方式實現(xiàn)多端差異化需求適配。最后是服務(wù)化,播放一層合并的過程中抽象出通用業(yè)務(wù)可以下沉為服務(wù)?!斑@樣下來,新的架構(gòu)很容易就出來了?!币坠鹫f。
播放一層我們定位為介于終端和服務(wù)層之間的實現(xiàn)終端差異化的系統(tǒng)。將播放一層的通用業(yè)務(wù)獨立為微服務(wù),下沉到服務(wù)層。微服務(wù)按功能劃分為起播、取串、播放頁信息、列表等各種服務(wù)化系統(tǒng)。而將各端播放一層合并為通用一層,合并后如何優(yōu)雅實現(xiàn)多端和多版本的差異化適配成為重中之重。易桂也表示,這一點也是此次演講的重點。
上述新的架構(gòu),其實就是BFF架構(gòu)(Backend for Frontends),為前端而存在的后端中間層。傳統(tǒng)的前后端分離應(yīng)用中,前端直接調(diào)用后端服務(wù),后端服務(wù)進行業(yè)務(wù)邏輯處理。那么引入了 BFF 之后,前端將直接和 BFF 通信,BFF 再和服務(wù)層進行 API 通信,所以本質(zhì)上來說,BFF 更像是一種“中間層”服務(wù)。對于BFF需要做到實現(xiàn)多端和多版本差異化適配,有以下幾種適配需求。
一是聚合,對于客戶端(特別是移動端)來說,HTTP 請求是很昂貴的,所以為了減少請求的次數(shù),前端一般會傾向于把有關(guān)聯(lián)的數(shù)據(jù)API合并為一個。
二是裁剪,不同屏幕的大小等差異,導(dǎo)致相同接口客戶端需要的響應(yīng)結(jié)果內(nèi)容大小不同。
三是適配,不同客戶端對后端響應(yīng)結(jié)果名稱要求不同。
那么,具體的聚合、裁剪、適配如何實現(xiàn)呢?
易桂表示,經(jīng)過調(diào)研之后,選中了GraphQL,一種為API而生的高性能查詢語言。GraphQL 作為一種 API 查詢語言,專門用于處理已有服務(wù)接口的響應(yīng)結(jié)果,已被Facebook、Netflix、GitHub使用。易桂舉例介紹道:“一個獲取視頻信息的接口,GraphQL分為服務(wù)端描述數(shù)據(jù)部分,我們在播放一層定義了Video類型數(shù)據(jù),有vid,videoName和serialno字段。同時GraphQL會把描述的數(shù)據(jù)與后端微服務(wù)接口做關(guān)聯(lián),指定哪個服務(wù)的哪個接口返回Video類型數(shù)據(jù)??蛻舳税葱枨笳埱蟛シ乓粚佣x的Video類型數(shù)據(jù),例如獲取vid為10000的視頻,且只需要videoName字段。此時播放一層給客戶端的響應(yīng)內(nèi)容就只有視頻名稱信息。”
GraphQL并不是一種編程語言,而是一種 API 查詢規(guī)格。它的結(jié)構(gòu)為三層結(jié)構(gòu),其中,最上層QuerySchema是客戶端按需請求的接口數(shù)據(jù)內(nèi)容,可對服務(wù)端描述數(shù)據(jù)的DataSchema做裁剪和適配等。中間DataSchema是用于服務(wù)端描述數(shù)據(jù)的。最底層的DataFetcher是靜態(tài)數(shù)據(jù)、DB、第三方接口等的包裝。
隨后易桂介紹:“以上就是對GraphQL的初步了解,那么GraphQL是如何做到聚合的?是通過多個服務(wù)接口數(shù)據(jù)聚合、裁剪掉冗余信息、自定義響應(yīng)內(nèi)容,以及GraphQL的高性能,即并發(fā)獲取數(shù)據(jù)和N+1問題的解決方案DataLoader等。”
而對于客戶端(特別是移動端)來說,HTTP 請求是很昂貴的,所以為了減少請求的次數(shù),前端一般會傾向于把有關(guān)聯(lián)的數(shù)據(jù)API合并為一個。比如Video類型的數(shù)據(jù)中,客戶端期望返回該視頻的基礎(chǔ)信息同時,還返回播放次數(shù)信息。服務(wù)端描述數(shù)據(jù)Video中增加playCount字段,標(biāo)識視頻的播放次數(shù)。同時給playCount綁定到播放次數(shù)服務(wù)的接口??蛻舳苏埱骎ideo數(shù)據(jù)時,也增加playCount字段,那么服務(wù)端響應(yīng)的Video數(shù)據(jù)就同時聚合了視頻基礎(chǔ)信息和播放次數(shù)信息。
那如何實現(xiàn)裁剪呢? 如果有客戶端獲取視頻信息時,不需要serialno集數(shù)字段,那么客戶端請求時,去掉serialno集數(shù)字段即可,服務(wù)端響應(yīng)的Video類型數(shù)據(jù)則沒有serialno字段。如果有客戶端需要接口響應(yīng)的視頻名稱不是videoName,而是vname, 那么客戶端請求給videoName取別名為vname,服務(wù)端響應(yīng)的Video類型數(shù)據(jù)中視頻名稱字段則為vname。
GraphQL引擎不僅靈活,還可以通過指定查詢策略為AsyncExecutionStrategy,實現(xiàn)多個DataFetcher并發(fā)執(zhí)行,提高性能。比如當(dāng)QuerySchema獲取視頻信息的同時,還要獲取播放次數(shù)和明星列表。GraphQL引擎在獲取到視頻信息后,會同時發(fā)起播放次數(shù)和明星列表的請求?!半m然GraphQL靈活,但也有天生的缺陷。比如獲取視頻列表的接口,每個視頻都需要返回其的明星列表。因此我們可以通過FaceBook的DataLoader來解決N+1問題。DataLoader支持通過Cache去除重復(fù)請求,同時支持去重、合并后,批量請求。”易桂說。
最終,GraphQL提供了如此豐富的特性,讓播放一層非常容易就實現(xiàn)了業(yè)務(wù)的差異化。易桂介紹:“在頁面展示的時候,視頻播放頁面展示列表的時候是播放技術(shù)和收藏,如左圖所示。存在著不同的使用場景,所以對于相同的數(shù)據(jù)卻有著不同的關(guān)注點,我們輕松就能實現(xiàn)這些功能。GraphQL讓播放一層應(yīng)用不再復(fù)雜。”
在微服務(wù)下基于 GraphQL 構(gòu)建的通用一層是什么樣子的呢?這便涉及到第四部分內(nèi)容——配置即接口,你值得擁有?!拔覀儗崿F(xiàn)了配置即可提供新接口給客戶端使用的目標(biāo)?!币坠鹫f。
播放一層基于Graphql-java開發(fā),整體分為三個部分。其中,QuerySchema部分是接入層,管理QuerySchema配置。支持客戶端傳入QuerySchema,也可以根據(jù)客戶端傳入的code或請求path和params通過規(guī)則映射到QuerySchema。而DataSchema部分是各個服務(wù)返回數(shù)據(jù)的圖形化組織,用于服務(wù)端描述數(shù)據(jù)。
最后,DataFetcher部分是下游服務(wù)的抽象層,可配置各個服務(wù)的域名、接口地址、請求參數(shù)(包括參數(shù)驗證)、響應(yīng)結(jié)果等,配套有熔斷、容錯和降級等功能。易桂介紹:“播放一層這三個部分,由于主體都是配置文件。故可以做到只需要修改配置,即可在已有微服務(wù)的基礎(chǔ)上,開發(fā)出新的接口?!?/p>
演講最后易桂提出,當(dāng)通用一層算法固定,只有配置變化時,能與我們的邊緣加速擦出怎樣的火花呢?
最后,易桂表示,期待后續(xù)與行業(yè)伙伴有深入的交流,并能得到先進技術(shù)的意見。