千萬(wàn)QPS毫秒響應(yīng):快手?jǐn)?shù)據(jù)中臺(tái)建設(shè)實(shí)踐
“
本文整理自快手?jǐn)?shù)據(jù)平臺(tái)部,數(shù)據(jù)服務(wù)化中臺(tái)負(fù)責(zé)人倪順發(fā)表的《快手?jǐn)?shù)據(jù)中臺(tái)建設(shè)-大數(shù)據(jù)服務(wù)化之路》的演講。
圍繞數(shù)據(jù)資產(chǎn)服務(wù)化,服務(wù)于業(yè)務(wù)產(chǎn)生商業(yè)價(jià)值進(jìn)行了分享:
-
第一部分是背景介紹,包括數(shù)據(jù)開(kāi)發(fā)的痛點(diǎn)。
-
第二部分是介紹大數(shù)據(jù)服務(wù)化平臺(tái),包括平臺(tái)架構(gòu)以及關(guān)鍵細(xì)節(jié)詳解。
-
第三部分是經(jīng)驗(yàn)總結(jié)和未來(lái)思考。
數(shù)據(jù)開(kāi)發(fā)的痛點(diǎn)
快手是一家數(shù)據(jù)驅(qū)動(dòng)的公司,數(shù)據(jù)扮演了非常重要的角色,而數(shù)據(jù)的生產(chǎn)加工主要依靠數(shù)據(jù)開(kāi)發(fā)工程師,其工作內(nèi)容會(huì)涉及多個(gè)方面。
數(shù)據(jù)開(kāi)發(fā)工程師則首先根據(jù)業(yè)務(wù)需求開(kāi)發(fā)好高質(zhì)量的數(shù)據(jù),通常是結(jié)構(gòu)化數(shù)據(jù)(數(shù)據(jù)表);其次,開(kāi)發(fā)穩(wěn)定可靠的數(shù)據(jù)服務(wù),并通過(guò) API 方式交付給業(yè)務(wù)方使用。
數(shù)據(jù)開(kāi)發(fā)工程師有兩個(gè)痛點(diǎn),這其中包括:
-
開(kāi)發(fā)數(shù)據(jù)服務(wù)門(mén)檻高
-
重復(fù)開(kāi)發(fā)數(shù)據(jù)服務(wù)
開(kāi)發(fā)數(shù)據(jù)服務(wù)門(mén)檻高
數(shù)據(jù)開(kāi)發(fā)工程師除了開(kāi)發(fā)完數(shù)據(jù)表外,通常還需要思考如下問(wèn)題:
①數(shù)據(jù)如何交付:業(yè)務(wù)通常期望使用數(shù)據(jù)接口方式來(lái)使用數(shù)據(jù),而非數(shù)據(jù)表,這會(huì)更加靈活、解耦、高效。數(shù)據(jù)開(kāi)發(fā)工程師因此需要建立對(duì)應(yīng)的數(shù)據(jù)服務(wù)。
②服務(wù)如何開(kāi)發(fā):數(shù)據(jù)服務(wù)有多種形式,通常要求開(kāi)發(fā)工程師有微服務(wù)知識(shí)、服務(wù)發(fā)現(xiàn)注冊(cè)、高并發(fā)等。
③權(quán)限、可用性問(wèn)題:開(kāi)發(fā)完數(shù)據(jù)服務(wù)后,需要考慮權(quán)限問(wèn)題,確保數(shù)據(jù)資源能被安全的訪問(wèn);此外還需要考慮可用性問(wèn)題,要以多種手段保障數(shù)據(jù)訪問(wèn)的穩(wěn)定性。
④運(yùn)維問(wèn)題:數(shù)據(jù)服務(wù)本身涉及多種運(yùn)維問(wèn)題,如擴(kuò)容、遷移、下線、接口變更、服務(wù)報(bào)警等。
以上問(wèn)題都需要數(shù)據(jù)開(kāi)發(fā)工程師去解決。這要求數(shù)據(jù)開(kāi)發(fā)不僅僅是開(kāi)發(fā)出數(shù)據(jù)表,還需要將數(shù)據(jù)表包裝成一個(gè)獨(dú)立的、靈活的、高可用的、安全的數(shù)據(jù)服務(wù)。
這對(duì)于數(shù)據(jù)開(kāi)發(fā)工程師要求很高:除了具備基本的業(yè)務(wù)需求捕獲、數(shù)據(jù)建模、SQL開(kāi)發(fā)等能力外,還要具備開(kāi)發(fā)高可用、高性能的數(shù)據(jù)服務(wù)能力(包括Java開(kāi)發(fā)、微服務(wù)等)。
重復(fù)開(kāi)發(fā)數(shù)據(jù)服務(wù)
快手很多業(yè)務(wù)線(如支付業(yè)務(wù)、直播業(yè)務(wù)、賬戶業(yè)務(wù)等),都存在數(shù)據(jù)需求,各業(yè)務(wù)線都做著:
①數(shù)據(jù)同步到線上數(shù)據(jù)庫(kù)和緩存。
② 建設(shè)微服務(wù)等開(kāi)發(fā),其中不同業(yè)務(wù)線下,數(shù)據(jù)同步和微服務(wù)通常有很多共同之處,重復(fù)煙囪式的開(kāi)發(fā)意味要重復(fù)開(kāi)發(fā)數(shù)據(jù)服務(wù),造成了人力資源浪費(fèi),而且開(kāi)發(fā)效率低,從數(shù)據(jù)開(kāi)發(fā)到最終交付數(shù)據(jù)服務(wù),需要經(jīng)歷較長(zhǎng)的周期。
基于上述痛點(diǎn),我們開(kāi)始建設(shè)統(tǒng)一的數(shù)據(jù)服務(wù)化平臺(tái)。由此開(kāi)啟一個(gè)新模式去解決問(wèn)題。
大數(shù)據(jù)服務(wù)化平臺(tái)
數(shù)據(jù)平臺(tái)本身的定位是一站式自助數(shù)據(jù)服務(wù)平臺(tái)。用戶通過(guò)平臺(tái)來(lái)創(chuàng)建數(shù)據(jù)服務(wù)接口、運(yùn)維服務(wù)、調(diào)用服務(wù)。
平臺(tái)秉承“配置即服務(wù)”的理念:數(shù)據(jù)開(kāi)發(fā)工程師不再需要手寫(xiě)數(shù)據(jù)服務(wù),只需要在平臺(tái)上進(jìn)行簡(jiǎn)單配置,平臺(tái)便可自動(dòng)生產(chǎn)和部署數(shù)據(jù)服務(wù),從而提升效率。
系統(tǒng)架構(gòu)
大數(shù)據(jù)服務(wù)化業(yè)務(wù)架構(gòu)如下所示,Data Lake 數(shù)據(jù)湖中存儲(chǔ)原始數(shù)據(jù),經(jīng)過(guò)數(shù)據(jù)開(kāi)發(fā)之后,形成按主題域組織的數(shù)據(jù)資產(chǎn)。
此時(shí)數(shù)據(jù)資產(chǎn)通常是在數(shù)據(jù)倉(cāng)庫(kù),訪問(wèn)速度較慢,因此需要通過(guò)數(shù)據(jù)加速到更高速的存儲(chǔ)介質(zhì),最后經(jīng)過(guò)多場(chǎng)景服務(wù)接口,服務(wù)于業(yè)務(wù)。
在技術(shù)架構(gòu)方面,數(shù)據(jù)接口形式有 RPC 和 HTTP 兩類接口。
RPC 接口不需要重復(fù)建立鏈接,且傳輸數(shù)據(jù)時(shí)會(huì)被高效序列化,適用于高吞吐場(chǎng)景下的微服務(wù),實(shí)現(xiàn)負(fù)載均衡、流控、降級(jí)、調(diào)用鏈追蹤等功能。相對(duì)而言,HTTP 接口傳輸效率低一些,但使用非常簡(jiǎn)單。
關(guān)鍵技術(shù)一:配置即開(kāi)發(fā)
平臺(tái)用戶分為兩類角色:其一是數(shù)據(jù)服務(wù)生產(chǎn)方,其二是數(shù)據(jù)服務(wù)調(diào)用方。數(shù)據(jù)服務(wù)生產(chǎn)方只需要配置,做到“配置即開(kāi)發(fā)”。
配置包括:
-
數(shù)據(jù)源
-
數(shù)據(jù)加速到何處
-
接口形態(tài),訪問(wèn)方式
-
配置獨(dú)立的測(cè)試環(huán)境,訪問(wèn)隔離的測(cè)試數(shù)據(jù)
當(dāng)配置完畢后,數(shù)據(jù)服務(wù)平臺(tái)便會(huì)根據(jù)配置清單,完成接口的自動(dòng)化生產(chǎn)和部署。
生產(chǎn)和部署完畢后,調(diào)用方在平臺(tái)申請(qǐng)服務(wù)權(quán)限調(diào)用。通過(guò)自動(dòng)化生產(chǎn),達(dá)到配置即開(kāi)發(fā)的目的,從而極大的提升效率。
關(guān)鍵技術(shù)二:多模式服務(wù)形態(tài)
數(shù)據(jù)服務(wù)有多種服務(wù)形態(tài),包括:
①KV API:簡(jiǎn)單點(diǎn)查,可以支撐百萬(wàn) QPS、毫秒延遲。這類 API 是通過(guò)模板自動(dòng)化創(chuàng)建出來(lái),支持單查、批量查詢等接口,返回的結(jié)果是 Protobuf (PB) 結(jié)構(gòu)體,從而將結(jié)果自動(dòng)做了 ORM,對(duì)于主調(diào)方更加友好。
典型場(chǎng)景包括:根據(jù) IP 查詢 geo 位置信息、根據(jù)用戶 Id 查詢用戶標(biāo)簽畫(huà)像信息等。
②SQL API:復(fù)雜靈活查詢,底層基于 OLAP/OLTP 存儲(chǔ)引擎。通過(guò) Fluent API 接口,用戶可自由組合搭配一種或若干種嵌套查詢條件,可查詢?nèi)舾珊?jiǎn)單字段或者聚合字段,可分頁(yè)或者全量取回?cái)?shù)據(jù)。
典型場(chǎng)景包括:用戶圈選(組合若干用戶標(biāo)簽篩選出一批用戶)。
③Union API:融合 API,可自由組合多個(gè)原子 API,組合方式包括串行和并行方式。
調(diào)用方不再需要調(diào)用多個(gè)原子 API,而是調(diào)用融合 API,通過(guò)服務(wù)端代理訪問(wèn)多個(gè)子查詢,可以極大降低訪問(wèn)延遲。
關(guān)鍵技術(shù)三:高效數(shù)據(jù)加速
前面提及的數(shù)據(jù)資產(chǎn),通常是存在于低速的存儲(chǔ)引擎中,無(wú)法支撐線上業(yè)務(wù)高訪問(wèn)流量。因此需要以系統(tǒng)化的方式進(jìn)行數(shù)據(jù)加速。
目前有兩種加速方式:
-
全量數(shù)據(jù)加速
-
多級(jí)緩存(部分?jǐn)?shù)據(jù)加速)
全量數(shù)據(jù)加速:從多個(gè)數(shù)據(jù)源攝入原始數(shù)據(jù)(如 Kafka,MySQL、線上訪問(wèn)日志等),進(jìn)行加工建模后,得到數(shù)據(jù)資產(chǎn)。
數(shù)據(jù)資產(chǎn)經(jīng)由獨(dú)立的數(shù)據(jù)同步服務(wù),同步至其他更高速的存儲(chǔ)引擎,如 Redis、Hbase、Druid 等。
數(shù)據(jù)同步支持一次性或者周期性(小時(shí)、天、周等)將數(shù)據(jù)從 Hive 同步至其他存儲(chǔ)中,數(shù)據(jù)同步本身是基于分布式的調(diào)度系統(tǒng),內(nèi)核是基于 datax 進(jìn)行數(shù)據(jù)同步。
大數(shù)據(jù)服務(wù)化平臺(tái)單日同步的數(shù)據(jù)量達(dá)到 1200 億條,數(shù)據(jù) size 達(dá)到 20TB。
多級(jí)緩存:大數(shù)據(jù)服務(wù)化平臺(tái)會(huì)使用 Redis、Hbase、Druid、Clickhouse 等方式存儲(chǔ)所有數(shù)據(jù),但是部分存儲(chǔ)如 Hbase 速度可能較慢,針對(duì)熱點(diǎn)數(shù)據(jù)需要使用額外的熱點(diǎn)緩存來(lái) Cache 數(shù)據(jù)。
熱點(diǎn)緩存是多級(jí)緩存,針對(duì)每個(gè) API 接口,用戶可自由搭配組合多級(jí)緩存、靈活設(shè)置緩存策略。
此外,針對(duì)數(shù)據(jù)較大的 API,還可配置數(shù)據(jù)壓縮,通過(guò)多種壓縮方式(如 ZSTD,SNAPPY,GZIP 等),可將數(shù)據(jù)量顯著減少(部分 API 甚至能減少 90% 的數(shù)據(jù)存儲(chǔ)量)。
關(guān)鍵技術(shù)四:高可用保障
服務(wù)可用性是微服務(wù)領(lǐng)域內(nèi)的一大核心,服務(wù)的高可用通常需要組合多種手段來(lái)保障。
快手?jǐn)?shù)據(jù)服務(wù)化平臺(tái)通過(guò)多種方式來(lái)達(dá)到高可用的目的,主要包括:
-
彈性服務(wù)框架
-
資源隔離
-
全鏈路監(jiān)控
彈性服務(wù)框架
數(shù)據(jù)服務(wù)是部署在容器云環(huán)境,容器云是快手自研的彈性可伸縮的容器服務(wù),部署在其中的 RPC 服務(wù)會(huì)注冊(cè)到 KESS (快手自研服務(wù)注冊(cè)與發(fā)現(xiàn)中心),供主調(diào)方去調(diào)用,如有離群壞點(diǎn),會(huì)自動(dòng)摘除。
服務(wù)調(diào)用是基于 RPC,全鏈路都有監(jiān)控,包括服務(wù)可用性、延遲、QPS、容器CPU、容器內(nèi)存等情況。
資源隔離
資源隔離是可用性保障的常見(jiàn)手段之一,通過(guò)隔離將意外故障等情況的影響面降低。
不管是微服務(wù),還是存儲(chǔ),我們都按照業(yè)務(wù)+優(yōu)先級(jí)(高、中、低)粒度隔離部署,獨(dú)立保障,業(yè)務(wù)之間互不影響、業(yè)務(wù)內(nèi)不同級(jí)別也互不影響。
同一業(yè)務(wù)線內(nèi)可能有多個(gè)不同數(shù)據(jù)服務(wù),通過(guò)混合部署,提高資源使用率。
全鏈路監(jiān)控
服務(wù)很難避免出現(xiàn)問(wèn)題或者故障,一旦出現(xiàn)問(wèn)題,及早發(fā)現(xiàn)及早介入是非常重要的。
服務(wù)平臺(tái)構(gòu)建了全鏈路監(jiān)控,包括:
-
數(shù)據(jù)同步:對(duì)數(shù)據(jù)資產(chǎn)同步至高速存儲(chǔ)的過(guò)程進(jìn)行監(jiān)控,包括數(shù)據(jù)質(zhì)量檢測(cè)(過(guò)濾臟數(shù)據(jù))、同步超時(shí)或者失敗檢測(cè)等。
-
服務(wù)穩(wěn)定性:構(gòu)建一個(gè)獨(dú)立的哨兵服務(wù),來(lái)監(jiān)測(cè)每個(gè) API 的運(yùn)行指標(biāo)(如延遲、可用性等),客觀的評(píng)估健康度。
- 業(yè)務(wù)正確性: 數(shù)據(jù)服務(wù)需要確保用戶訪問(wèn)的數(shù)據(jù)內(nèi)容和數(shù)據(jù)資產(chǎn)表內(nèi)容是一致的,因此哨兵服務(wù)會(huì)從數(shù)據(jù)一致性層面去探查,確保每個(gè) API 的數(shù)據(jù)一致性。
總結(jié)和展望
大數(shù)據(jù)服務(wù)化平臺(tái)從 2017 年演化至今,已經(jīng)支持多類應(yīng)用場(chǎng)景,涵蓋直播、短視頻、電商、商業(yè)化等在線業(yè)務(wù),生產(chǎn)者中臺(tái)等準(zhǔn)在線業(yè)務(wù),運(yùn)營(yíng)系統(tǒng)等偏內(nèi)部數(shù)據(jù)系統(tǒng)等,目前平臺(tái)在線業(yè)務(wù)總 QPS 達(dá)到 1000W,平均延遲在毫秒級(jí)。
對(duì)于準(zhǔn)在線業(yè)務(wù)和內(nèi)部數(shù)據(jù)系統(tǒng),基于 CH、Druid 等多種數(shù)據(jù)引擎,支持多種靈活查詢。
數(shù)據(jù)服務(wù)平臺(tái)支持了多種模式 API,很好滿足了多元化需求。此外數(shù)據(jù)服務(wù)平臺(tái)也支持服務(wù)權(quán)限、API 市場(chǎng)等豐富功能,進(jìn)一步賦能業(yè)務(wù)。
大數(shù)據(jù)服務(wù)化平臺(tái)未來(lái)進(jìn)一步發(fā)展方向主要包括:
①貼近業(yè)務(wù)需求:數(shù)據(jù)服務(wù)平臺(tái)本身是為業(yè)務(wù)服務(wù),通過(guò)賦能業(yè)務(wù)而對(duì)企業(yè)帶來(lái)價(jià)值,業(yè)務(wù)本身在不斷發(fā)展,未來(lái)也會(huì)有更多的需求出現(xiàn),因此數(shù)據(jù)服務(wù)平臺(tái)本身會(huì)不斷抽象和沉淀出公共數(shù)據(jù)服務(wù)能力。
②深耕 數(shù)據(jù)資產(chǎn): 數(shù)據(jù)資產(chǎn)是數(shù)據(jù)服務(wù)之根本,如果沒(méi)有完善的數(shù)據(jù)資產(chǎn)建設(shè),上面就很難構(gòu)建出結(jié)構(gòu)化的統(tǒng)一的數(shù)據(jù)服務(wù),針對(duì)數(shù)據(jù)資產(chǎn)有較多內(nèi)容,包括資產(chǎn)注冊(cè)和審核、資產(chǎn)地圖、資產(chǎn)標(biāo)簽、資產(chǎn)管理、資產(chǎn)開(kāi)放和服務(wù)。
大數(shù)據(jù)服務(wù)平臺(tái)的能力建設(shè)會(huì)朝著統(tǒng)一的 OneService 體系前進(jìn)。
主要包括三個(gè)方面:
-
支持豐富的數(shù)據(jù)源:包括大寬表、文本文件、機(jī)器學(xué)習(xí)模型(模型也是一種數(shù)據(jù)資產(chǎn)),來(lái)構(gòu)建完善的數(shù)據(jù)服務(wù)。
-
支持多樣取數(shù)方式:除了支持同步快速取數(shù)之外,還支持異步查詢?nèi)?shù)、推送結(jié)果、定時(shí)任務(wù)等多樣化方式,以滿足業(yè)務(wù)多種場(chǎng)景需求。
-
建設(shè)統(tǒng)一的 API 網(wǎng)關(guān):集成權(quán)限管控、限流降級(jí)、流量管理等于一體,不僅平臺(tái)創(chuàng)建的服務(wù)可以注冊(cè)進(jìn) API 網(wǎng)關(guān),用戶自己開(kāi)發(fā)的 API 也可注冊(cè)進(jìn) API 網(wǎng)關(guān),從而享受已有的基礎(chǔ)網(wǎng)關(guān)能力,為業(yè)務(wù)提供數(shù)據(jù)服務(wù)能力。
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!