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