魅族架構(gòu)師胡成元 剖析魅族應(yīng)用商店架構(gòu)
原創(chuàng)魅族應(yīng)用商店作為國內(nèi)最早的應(yīng)用分發(fā)平臺(tái),國內(nèi)首創(chuàng)了許多新業(yè)務(wù)模式,比較典型的有應(yīng)用內(nèi)付費(fèi)。但受限于其早期的封閉生態(tài),發(fā)展速度緩慢,這并不影響魅族人對技術(shù)架構(gòu)的追尋與探索。
【作者簡介】
胡成元·魅族Flyme互聯(lián)網(wǎng)架構(gòu)師
胡成元,魅族Flyme互聯(lián)網(wǎng)架構(gòu)師。2011年加入魅族, 一直致力于移動(dòng)應(yīng)用架構(gòu)研發(fā),提升產(chǎn)品體驗(yàn)和研發(fā)效率, 目前主要負(fù)責(zé)魅族應(yīng)用商店的研發(fā)架構(gòu)工作。
服務(wù)化框架
平臺(tái)早期,規(guī)模小、結(jié)構(gòu)簡單,職責(zé)多、關(guān)系復(fù)雜、變更影響大、擴(kuò)展難。伴隨公司互聯(lián)網(wǎng)轉(zhuǎn)型,用戶規(guī)模高速增長,原有架構(gòu)完全無法很好的服務(wù)大規(guī)模的Flyme用戶。
應(yīng)用分發(fā)平臺(tái)主要解決兩個(gè)問題,一是如何讓Flyme用戶方便快捷的找到自己需要的應(yīng)用;另一個(gè)是如何幫助開發(fā)者簡單迅速的將應(yīng)用推廣給Flyme用戶。基于這兩個(gè)基本需求,我們把業(yè)務(wù)邏輯模塊化,單元化。拆分出了應(yīng)用管理、應(yīng)用展示(榜單)、應(yīng)用推薦(個(gè)性化推薦)、應(yīng)用搜索等多個(gè)服務(wù)。
服務(wù)分為兩類,一類是基礎(chǔ)服務(wù),該類型服務(wù)不依賴其他服務(wù),業(yè)務(wù)邏輯簡單,僅提供基礎(chǔ)業(yè)務(wù)邏輯,例如應(yīng)用詳情服務(wù)。另一類是聚合服務(wù),該類聚合多個(gè)基礎(chǔ)服務(wù),形成相對復(fù)雜的業(yè)務(wù)邏輯,例如應(yīng)用搜索服務(wù)。
服務(wù)間采用自研的Kiev框架通訊,當(dāng)然也有成型的開源方案(DUBBO)可以選擇。Kiev底層通訊基于Netty網(wǎng)絡(luò)框架,序列化支持協(xié)議支持Hessian、Protobuffer等,通訊協(xié)議支持TCP、UDP等??蚣芑赯K(ZooKeeper)實(shí)現(xiàn)了High Availability與Load Balance策略。服務(wù)調(diào)用時(shí)會(huì)采樣生成詳細(xì)的調(diào)用鏈,收集產(chǎn)生豐富的服務(wù)狀態(tài)數(shù)據(jù)(Response Time,QPS),為服務(wù)治理提供了詳實(shí)有力數(shù)據(jù)支撐。
接口規(guī)范
接口眾多、形式多樣,管理維護(hù)成本搞,為了規(guī)范開發(fā)流程、便于問題跟蹤定位,我們制定了統(tǒng)一的接口規(guī)范。例如接口采用RESTful風(fēng)格,統(tǒng)一的接口返回形式,約定每個(gè)業(yè)務(wù)層的錯(cuò)誤編碼,每個(gè)錯(cuò)誤編碼還會(huì)攜帶可選的錯(cuò)誤提示,方便問題跟蹤。
安全性也是平臺(tái)不可忽略的一個(gè)關(guān)鍵點(diǎn),基于通用型的原則,我們采用了業(yè)界通用OAuth協(xié)議來保障接口安全。為了應(yīng)對異常流量對系統(tǒng)造成的沖擊,我們給接口層添加了流量控制功能。
#p#
分布式緩存
平臺(tái)早期,分發(fā)接口采用DB+本地緩存的方式提供數(shù)據(jù),這種模式DB壓力大、接口吞吐量小、本地緩存更新不及時(shí)。為了解決這些問題,我們引入的分布式緩存Redis。業(yè)務(wù)接口數(shù)據(jù)全部被緩存到Redis集群,緩存數(shù)據(jù)由定時(shí)任務(wù)主動(dòng)刷新,零穿透,緩存即存儲(chǔ)、存儲(chǔ)即緩存。依托Redis的高性能極大的提高了系統(tǒng)吞吐量。Redis集群先按業(yè)務(wù)場景做垂直切分、再根據(jù)數(shù)據(jù)量做水平分片。業(yè)務(wù)通過代理(Twemproxy)連接所有分片。 Redis集群基于ZK實(shí)現(xiàn)High Availability,基于定制化腳本實(shí)現(xiàn)線上自動(dòng)擴(kuò)容,這樣既保障了緩存集群的高可用性,又滿足了集群容量自動(dòng)擴(kuò)充的需求。
MySQL水平分片
隨著用戶規(guī)模增長,單庫單表已無法滿足業(yè)務(wù)需求,為此我們將數(shù)據(jù)量大的用戶數(shù)據(jù)橫向拆分出多個(gè)數(shù)據(jù)庫。為了降低運(yùn)維成本,我們采用了單實(shí)例多數(shù)據(jù)庫的部署模式。業(yè)務(wù)層通過分庫路由組件透明的訪問數(shù)據(jù)庫。當(dāng)單實(shí)例多數(shù)據(jù)庫的模式無法支撐當(dāng)前業(yè)務(wù)需求時(shí),通過更新路由規(guī)則就可以平滑的完成DB擴(kuò)容。
水平分層、垂直拓展
如下圖所示。橫向、典型的三層架構(gòu)??v向、以業(yè)務(wù)為驅(qū)動(dòng),積累沉淀了眾多技術(shù)規(guī)范、基礎(chǔ)組件,豐富完善了全棧業(yè)務(wù)監(jiān)控。依托完善的監(jiān)控體系,衍生出了相應(yīng)的服務(wù)治理機(jī)制。
消息隊(duì)列(MetaQ)
消息隊(duì)列是分布式應(yīng)用間交換信息的一種技術(shù)。為了解耦核心業(yè)務(wù)及輔助業(yè)務(wù)。我們引入消息隊(duì)列,將搜索團(tuán)隊(duì)、大數(shù)據(jù)團(tuán)隊(duì)需要的業(yè)務(wù)數(shù)據(jù)定期全量同步,實(shí)時(shí)增量更新。既隔離了業(yè)務(wù)間的強(qiáng)耦合,又保障了數(shù)據(jù)的及時(shí)性。
多機(jī)房部署
當(dāng)業(yè)務(wù)規(guī)模增長到一定規(guī)模后,機(jī)房的網(wǎng)絡(luò)、帶塊、機(jī)架等相關(guān)資源都會(huì)成為瓶頸。所有的雞蛋放在一個(gè)籃子里,對產(chǎn)品來說也是一個(gè)巨大的風(fēng)險(xiǎn)點(diǎn)。為此我們陸續(xù)引進(jìn)了主備機(jī)房、雙活機(jī)房、多地多中心的部署結(jié)構(gòu)。為了動(dòng)態(tài)調(diào)度機(jī)房間流量,保障用戶就近訪問,故障無縫切換,我們上線了GSLB(Global Server Load Balance)。
下載防劫持
HTTP劫持是指網(wǎng)頁或文件在網(wǎng)絡(luò)節(jié)點(diǎn)間傳輸時(shí),信息被篡改替換的網(wǎng)絡(luò)攻擊行為。近來國內(nèi)各大應(yīng)用分發(fā)平臺(tái)都有不同的程度的應(yīng)用下載被劫持現(xiàn)象,我們也難置身事外,為此,我們上線文件下載防劫持方案。
如下圖所示。平臺(tái)客戶端在下載應(yīng)用前后根據(jù)應(yīng)用分發(fā)時(shí)攜帶的應(yīng)用信息校驗(yàn)應(yīng)用文件(APK)的合法性,如果文件校驗(yàn)成功,直接下載并安裝應(yīng)用,否則更換為HTTPS通道繼續(xù)下載應(yīng)用。為防止CDN與源站的網(wǎng)絡(luò)被劫持,CDN回原前后也會(huì)校驗(yàn)文件信息。無論劫持動(dòng)作是否成功修復(fù),客戶端均會(huì)上報(bào)操作日志,以便分析改進(jìn)防劫持功能。
業(yè)務(wù)在不斷發(fā)展,架構(gòu)也隨之而演進(jìn)。魅族人也在不斷追尋夢想。
了解更多魅族應(yīng)用商店精彩信息戳這里http://open.flyme.cn。