版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
抖音架構演進前言介紹2016.09.26,抖音版本1.0.0上線,隨后不斷迭代優(yōu)化和豐富產(chǎn)品,截止目前,抖音日活躍用戶突破6億,短短4年間,抖音從零爆發(fā)性增長??焖俚臉I(yè)務發(fā)展也對技術支撐提出了更高的要求,為了保障敏捷的業(yè)務開發(fā),提升跨團隊的協(xié)同合作效率,提高本地研發(fā)和
CI/CD效率,抖音iOS
App工程架構在不同的階段進行了不同的技術方案的改進,滿足合理的架構演化,同時又不影響正常的業(yè)務迭代速度。抖音工程架構演進合理的架構設計可以解決大型項目跨團隊協(xié)作分工和多業(yè)務線并行開發(fā)的效率問題。抖音工程代碼從一開始就采用了組件化思路,依賴管理工具是定制版的Cocoapods。組件化在大型項目快速發(fā)展的過程中,要保證敏捷開發(fā)迭代的最大障礙就是快速膨脹的代碼體積導致的編譯效率問題,依賴關系復雜化問題,以及業(yè)務線代碼沖突問題。移動端項目可以類比后端項目中采用的微服務架構,要解決多業(yè)務線并行開發(fā)、并行測試問題,采用流水
線式迭代開發(fā),提高發(fā)版、集成、交付、提審、發(fā)布效率,結合分治思想技術選型上可以采用組件化的方案。大部分小型項目,組件化僅僅做到代碼分倉,使用Cocoapods的來管理組件依賴,就像抖音項目最初的工程形態(tài)。但是對于幾百號人、幾十個業(yè)務線規(guī)模的大型項目,需要設計一套合理的組件分層架構,理清組件間依賴關系,需要CI/CD工具鏈支撐組件發(fā)版與集成,需要本地研發(fā)工具支撐本地代碼同步、工程配置、依賴管理和效率優(yōu)化。抖音工程架構演進流水線式迭代開發(fā)流水線(pipeline)技術是指在程序執(zhí)行時多條指令重疊進行操作的一種準并行實現(xiàn)技術,該技術可以充分提高資源的利用率,同時縮短產(chǎn)品的研發(fā)周期。對于客戶端項目,流水線技術能很大程度滿足敏捷開發(fā)迭代的節(jié)奏。01抖音原始工程架構(Original
architecture
of
project)03單倉多組件工程架構(Multicomponents
in
single
repo)0204分離殼工程后的工程架構(After
splitting
of
host
shell
pod)Example子殼工程架構(Subshell
for
bizcomponent
inexample
project)抖音工程架構演進抖音工程架構演進階段一:抖音原始工程架構(Original
architecture
of
project)抖音項目一開始是單體架構+Cocoapods,業(yè)務代碼、工程配置、資源文件全部放在一個大業(yè)務倉庫。由
Podfile文件描述第三方倉庫的依賴版本。抖音項目原始工程架構圖抖音工程架構演進階段一:抖音原始工程架構(Original
architecture
of
project)抖音項目一開始是單體架構+Cocoapods,業(yè)務代碼、工程配置、資源文件全部放在一個大業(yè)務倉庫。由
Podfile文件描述第三方倉庫的依賴版本。抖音項目原始工程架目錄結構抖音工程架構演進階段二:分離殼工程后的工程架構(After
splitting
of
host
shell
pod)分離殼工程后,工程配置、部分系統(tǒng)資源、工程主入口被拆分到主宿主殼工程。部分基礎能力代碼被拆分成基礎倉庫,跟第三方倉庫一樣獨立發(fā)版。本地研發(fā)工具支持單倉開發(fā)和多倉開發(fā),不參與代碼修改的倉庫通過二進制的方式進行鏈接。同時
CI流程上也支持通過二進制打測試包,提高打包效率。Podfile拆分出版本依賴管理文件Podfile.seer,由依賴管理平臺進行各個版本的容器化管理,業(yè)務倉跟隨宿主集
成發(fā)版,打平依賴,解決版本依賴決議
耗時問題。拆分殼工程后的工程架構抖音工程架構演進階段二:分離殼工程后的工程架構(After
splitting
of
host
shell
pod)Podfile拆分出版本依賴管理文件Podfile.seer,由依賴管理平臺進行各個版本的容器化管理,業(yè)務倉跟隨宿主集
成發(fā)版,打平依賴,解決版本依賴決議
耗時問題。大業(yè)務倉中的代碼和資源被拆分到各個業(yè)務線的倉庫下,由
podspec文件描述內(nèi)外依賴。業(yè)務線倉庫增加
ModuleInterface
subspec,存放對外接口,采用依賴注入方式實現(xiàn)接口隔離,初步建立接口層。業(yè)務倉庫之間規(guī)定只能依賴其他業(yè)務倉庫的
ModuleInterface
subspec,通過lint進行編譯檢查。抖音項目拆分殼工程后目錄結構抖音工程架構演進階段二:分離殼工程后的工程架構(After
splitting
of
host
shell
pod)殼工程為了滿足一個工程同時支持多個項目、部分業(yè)務線功能復用、部分業(yè)務線中臺化發(fā)展的需求,我們把所有業(yè)務線抽象成獨立的Pod,所有業(yè)務Pod必須通過宿主的殼工程進行集成發(fā)版。殼工程包含了項目依賴的Pod信息描述,
同時還包括工程的配置、部分系統(tǒng)級別的資源文件、工程主入口代碼。基于多份宿主殼工程,一份代碼可以打包出抖音、抖音極速版等項目。同時,基于宿主殼工程,一些業(yè)務線可以通過自動化同步生成自己的子殼工程,實現(xiàn)業(yè)務線自己的Example工程,進行獨立開發(fā),比如有語音通話的Example工程,有工具的
Example工程,有直播的Example工程等等。殼工程抽象子殼工程配置同步同步抖音工程架構演進階段二:分離殼工程后的工程架構(After
splitting
of
host
shell
pod)接口層接口層顧名思義,只提供依賴的抽象接口,所有接口都是
protocol協(xié)議聲明。接口層限制了所有其他依賴,類、枚舉、外部協(xié)議都采用前向聲明,podspec上只允許聲明對
DI(依賴注入)框架的依賴。接口層滿足封裝、隔離和組合的原則。業(yè)務層面對外封裝了實現(xiàn)代碼;
編譯層面隔離了組件間依賴傳遞,減少頭文件
import嵌套提高編譯緩存的命中率,對于
swift業(yè)務組件,還能達到減少編譯傳遞的問題;架構層面聲明抽象協(xié)議支持接口組合;DI容器框架同時支持
stateless
DI容器,也支持
stateful
DI容器。抖音工程架構演進階段二:分離殼工程后的工程架構(After
splitting
of
host
shell
pod)依賴打平
采用Cocoapods本身自帶的版本依賴決議進行版本分析會消耗大量的時間;Podfile.lock過于繁瑣,可讀性很差,難以解決Podfile.lock的沖突;
隱式依賴被動/不符合預期地升級,難以確定性地聲明所有依賴,防止隱式依賴被升級;
依賴版本在Podfile/Podfile.lock重復聲明,增加了解決沖突的成本;
Podfile.lock參與依賴版本決議流程比較復雜,會出現(xiàn)不符合預期的情況。
hook掉Cocoapods采用podfile.lock進行版本決議的邏輯,采用Podfile.seer文件直接描述所有組件的版本信息,打平依賴。把版本管理和倉庫源信息遷移到Podfile.seer文件抖音工程架構演進階段三:單倉多組件工程架構(Multicomponents
in
single
repo)采用單倉多組件后,每個業(yè)務線倉庫支持添加
podspec增加組件,實現(xiàn)更小粒度的二進制依賴。業(yè)務線倉庫內(nèi)劃分業(yè)務實現(xiàn)層、業(yè)務接口層、服務層和基礎層,都是通過集成方式發(fā)版。新增的服務層主要存放公共的業(yè)務邏輯和通用服務,限制
UI。一、滿足業(yè)務邏輯復用;二、滿足子殼工程最小化二進制依賴。拆分單倉多組件后的工程架構抖音工程架構演進階段三:單倉多組件工程架構(Multicomponents
in
single
repo)同時服務層的服務接口也達到隔離依賴傳遞的目的,在不同的宿主上,支持通過改變服務層實現(xiàn)替換后臺能力或者底層能力。建立分層間的依賴準入規(guī)則,完善
lint編譯鏈接檢查。編譯鏈接完備性校驗編譯校驗:分開編譯各個
subspec,確保每個subspec的依賴是正確的(由于
subspec沒有編譯隔離)接口符號校驗:校驗當前接口組件(ModuleInterface)中符號是否完備的,以保證其他組件單獨引用是否能正常使用。如
extern聲明的全局變量。單倉多組件目錄結構抖音工程架構演進階段三:單倉多組件工程架構(Multicomponents
in
single
repo)分層依賴準入規(guī)則:高層依賴低層實現(xiàn)依賴接口接口層無依賴前向聲明優(yōu)先服務層去"UI"業(yè)務實現(xiàn)層和服務實現(xiàn)允許依賴的分層抖音工程架構演進階段四:Example子殼工程架構(Subshell
for
bizcomponent
in
example
project)每個業(yè)務倉從宿主同步工程配置構建子殼工程。增加
AWELaunchKit為子
殼工程提供運行時的基礎能力。通過服務層提供業(yè)務間運行時共享的服務能力,滿足代碼復用和更小二進制依賴。子殼工程架構抖音工程架構演進,階段四:Example子殼工程架構(Subshell
for
bizcomponent
in
example
project)每個業(yè)務倉從宿主同步工程配置構建子殼工程。增加
AWELaunchKit為子
殼工程提供運行時的基礎能力。通過服務層提供業(yè)務間運行時共享的服務能力滿足代碼復用和更小二進制依賴。子殼工程目錄結構抖音工程架構演進。階段四:Example子殼工程架構(Subshell
for
bizcomponent
in
example
project)AWELaunchKitAWELaunchKit框架為宿主和其他子殼工程提供了基礎服務的依賴和初始化配置同時提供了一套啟動加載的
BootTasks
管理框架,部分業(yè)務涉及啟動相關的邏輯可以在業(yè)務倉對應的服務層中實現(xiàn),并通過
BootTasks管理框架注冊到啟動加載器里面。同時框架還提供了一套宿主
UI入口和自定義入口框架。為了方便測試和調(diào)試,也整合了整套測試調(diào)試框架。子殼工程依賴關系抖音工程架構演進組件化探索過程中遇到的一些問題:二進制污染組件之間的依賴除了顯式的依賴,還存在很多隱式依賴,代碼層面,除了普通的接口依賴,還有宏依賴、枚舉依
賴、全局變量依賴以及內(nèi)聯(lián)函數(shù)等的依賴。單倉
lint進行編譯鏈接完備性檢查并不能解決依賴變動對其他二進制的影響。因此需要借助源碼層面的依賴分析,判斷當前組件的變更對其他依賴當前組件的二進制是否有影響,在
CI流程中及時發(fā)現(xiàn)并攔截。否則錯誤的二進制發(fā)版,會直接導致整個
CI研發(fā)流程和本地研發(fā)都受到影響。編譯優(yōu)化編譯優(yōu)化最高效的方式就是提高緩存的利用率。對于本地研發(fā)和CI流程,都涉及分布式編譯緩存同步。同時通過編譯參數(shù)優(yōu)化、依賴優(yōu)化、hmap優(yōu)化也能不同程度的提高編譯效率主干分支穩(wěn)定性問題對于多業(yè)務線并行開發(fā),幾百號人的業(yè)務開發(fā)團隊,如果主干分支一旦出現(xiàn)問題,那么解決問題的時間就需要乘上幾百倍。因此,需要從編譯層面和運行層面都要有足夠的機制去保證一個穩(wěn)定的主干分支,才能保證業(yè)務側的長期穩(wěn)定性。抖音工程架構演進組件化探索過程中遇到的一些問題:業(yè)務層的依賴耦合問題大型項目動則千萬行的代碼,代碼間的依賴關系是復雜的網(wǎng)狀關系。需要基于代碼的語法樹模型,從語義中去分析不合理的依賴,并輸出治理的方案。因此內(nèi)部自研了源碼依賴關系分析平臺用于依賴關系分析監(jiān)控和代碼治理,長期監(jiān)控組件間的依賴度。同時,需要建立依賴健康度模型,從長期演進的角度去監(jiān)控防止代碼的劣化。spider組件依賴分析平臺總結大型項目的組件化工作是一個系統(tǒng)性工程。涉及工程架構的改造、CI/CD研發(fā)工具鏈的支撐、本地研發(fā)工具鏈的支撐,業(yè)務架構的設計優(yōu)化,需要從各個方面綜合考慮成本和收益。沒有最好的架構,只有更好的架構,在架構演進的過程中,需要充
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國退役軍人合作協(xié)議
- 2025年度個人房產(chǎn)抵押貸款合同范文2篇
- 2025年個人房屋買賣合同示范文本下載
- 工地食堂承包協(xié)議
- 2025年度個人二手房買賣合同參考范本(全流程指導)
- 2025年全球及中國瓶到瓶回收行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025-2030全球汽車啟動鋰電池行業(yè)調(diào)研及趨勢分析報告
- 2025-2030全球無人機起降系統(tǒng)行業(yè)調(diào)研及趨勢分析報告
- 2025版塔吊租賃及施工安全保障服務合同3篇
- 塔吊司機安全作業(yè)協(xié)議書
- 蛋糕店服務員勞動合同
- 土地買賣合同參考模板
- 2025高考數(shù)學二輪復習-專題一-微專題10-同構函數(shù)問題-專項訓練【含答案】
- 新能源行業(yè)市場分析報告
- 2025年天津市政建設集團招聘筆試參考題庫含答案解析
- 巖土工程勘察.課件
- 60歲以上務工免責協(xié)議書
- 康復醫(yī)院患者隱私保護管理制度
- 2022年7月2日江蘇事業(yè)單位統(tǒng)考《綜合知識和能力素質(zhì)》(管理崗)
- 沈陽理工大學《數(shù)》2022-2023學年第一學期期末試卷
- 初一英語語法練習
評論
0/150
提交評論