數(shù)據(jù)部門產(chǎn)出的海量數(shù)據(jù),如何能方便高效地開(kāi)放出去,是我們一直想要解決的難題。在沒(méi)有數(shù)據(jù)服務(wù)的年代,數(shù)據(jù)開(kāi)放的方式簡(jiǎn)單、粗暴,一般是直接將數(shù)據(jù)導(dǎo)出給對(duì)方。這種方式不僅低效,還帶來(lái)了安全隱患等諸多問(wèn)題。
為此,我們?cè)跀?shù)據(jù)服務(wù)這個(gè)方向上不斷探索和實(shí)踐。最早的數(shù)據(jù)服務(wù)雛形誕生于2010年,至今已有7個(gè)年頭。在這期間,隨著我們對(duì)業(yè)務(wù)的理解不斷加深,同時(shí)也得益于新技術(shù)的持續(xù)涌現(xiàn),對(duì)數(shù)據(jù)服務(wù)架構(gòu)也進(jìn)行了多次升級(jí)改造。服務(wù)架構(gòu)的每次升級(jí),均在性能、穩(wěn)定性、擴(kuò)展性等方面有所提升,從而能更好地服務(wù)于用戶。
1.服務(wù)架構(gòu)的演進(jìn)
阿里數(shù)據(jù)服務(wù)架構(gòu)演進(jìn)過(guò)程如圖6.1所示?;谛阅?、擴(kuò)展性和穩(wěn)定性等方面的要求,我們不斷升級(jí)數(shù)據(jù)服務(wù)的架構(gòu),依次經(jīng)歷了內(nèi)部代號(hào)為DWSOA、OpenAPI、SmartDQ和OneService的四個(gè)階段。

阿里數(shù)據(jù)服務(wù)架構(gòu)演進(jìn)過(guò)程
其中,第四個(gè)階段是統(tǒng)一的數(shù)據(jù)服務(wù)層(即OneService)。大家心里可能會(huì)有疑問(wèn):SQL并不能解決復(fù)雜的業(yè)務(wù)邏輯啊。確實(shí),SmartDQ其實(shí)只滿足了簡(jiǎn)單的查詢服務(wù)需求。我們遇到的場(chǎng)景還有這么幾類:個(gè)性化的垂直業(yè)務(wù)場(chǎng)景、實(shí)時(shí)數(shù)據(jù)推送服務(wù)、定時(shí)任務(wù)服務(wù)。所以O(shè)neService主要是提供多種服務(wù)類型來(lái)滿足用戶需求,分別是OneService-SmartDQ、OneService-Lego、OneService-iPush、OneService-uTiming。
在OneService階段,開(kāi)始真正走向平臺(tái)化。我們提供數(shù)據(jù)服務(wù)的核心引擎、開(kāi)發(fā)配置平臺(tái)以及門戶網(wǎng)站。數(shù)據(jù)生產(chǎn)者將數(shù)據(jù)入庫(kù)之后,服務(wù)提供者可以根據(jù)標(biāo)準(zhǔn)規(guī)范快速創(chuàng)建服務(wù)、發(fā)布服務(wù)、監(jiān)控服務(wù)、下線服務(wù),服務(wù)調(diào)用者可以在門戶網(wǎng)站中快速檢索服務(wù),申請(qǐng)權(quán)限和調(diào)用服務(wù)。
2.技術(shù)架構(gòu)
SmartDQ的元數(shù)據(jù)模型,簡(jiǎn)單來(lái)說(shuō),就是邏輯表到物理表的映射。自底向上分別是:
?。?)數(shù)據(jù)源:SmartDQ支持跨數(shù)據(jù)源查詢,底層支持接入多種數(shù)據(jù)源,比如MySQL、HBase、OpenSearch等。
?。?)物理表:物理表是具體某個(gè)數(shù)據(jù)源中的一張表。每張物理表都需要指明主鍵由哪些列組成,主鍵確定后即可得知該表的統(tǒng)計(jì)粒度。
?。?)邏輯表:邏輯表可以理解為數(shù)據(jù)庫(kù)中的視圖,是一張?zhí)摂M表,也可以看作是由若干主鍵相同的物理表構(gòu)成的大寬表。SmartDQ對(duì)用戶展現(xiàn)的只是邏輯表,從而屏蔽了底層物理表的存儲(chǔ)細(xì)節(jié)。
?。?)主題:邏輯表一般會(huì)掛載在某個(gè)主題下,以便進(jìn)行管理與查找。
iPush應(yīng)用產(chǎn)品是一個(gè)面向TT、MetaQ等不同消息源,通過(guò)定制過(guò)濾規(guī)則,向Web、無(wú)線等終端推送消息的中間件平臺(tái)。iPush核心服務(wù)器端基于高性能異步事件驅(qū)動(dòng)模型的網(wǎng)絡(luò)通信框架Netty 4實(shí)現(xiàn),結(jié)合使用Guava緩存實(shí)現(xiàn)本地注冊(cè)信息的存儲(chǔ),F(xiàn)ilter與Server之間的通信采用Thrift異步調(diào)用高效服務(wù)實(shí)現(xiàn),消息基于Disruptor高性能的異步處理框架(可以認(rèn)為是最快的消息框架)的消息隊(duì)列,在服務(wù)器運(yùn)行中Zookeeper實(shí)時(shí)監(jiān)控服務(wù)器狀態(tài),以及通過(guò)Diamond作為統(tǒng)一的控制觸發(fā)中心。
Lego
Lego被設(shè)計(jì)成一個(gè)面向中度和高度定制化數(shù)據(jù)查詢需求、支持插件機(jī)制的服務(wù)容器。它本身只提供日志、服務(wù)注冊(cè)、Diamond配置監(jiān)聽(tīng)、鑒權(quán)、數(shù)據(jù)源管理等一系列基礎(chǔ)設(shè)施,具體的數(shù)據(jù)服務(wù)則由服務(wù)插件提供?;贚ego的插件框架可以快速實(shí)現(xiàn)個(gè)性化需求并發(fā)布上線。
Lego采用輕量級(jí)的Node.JS技術(shù)棧實(shí)現(xiàn),適合處理高并發(fā)、低延遲的IO密集型場(chǎng)景,目前主要支撐用戶識(shí)別發(fā)碼、用戶識(shí)別、用戶畫像、人群透視和人群圈選等在線服務(wù)。底層根據(jù)需求特點(diǎn)分別選用Tair、HBase、ADS存儲(chǔ)數(shù)據(jù)。
uTiming
uTiming是基于在云端的任務(wù)調(diào)度應(yīng)用,提供批量數(shù)據(jù)處理服務(wù)。uTiming-scheduler負(fù)責(zé)調(diào)度執(zhí)行SQL或特定配置的離線任務(wù),但并不直接對(duì)用戶暴露任務(wù)調(diào)度接口。用戶使用數(shù)據(jù)超市工具或Lego API建立任務(wù)。注:本書中出現(xiàn)的部分專有名詞、專業(yè)術(shù)語(yǔ)、產(chǎn)品名稱、軟件項(xiàng)目名稱、工具名稱等,是淘寶(中國(guó))軟件有限公司內(nèi)部項(xiàng)目的慣用詞語(yǔ),如與第三方名稱雷同,實(shí)屬巧合。
