抖音架構(gòu)演進(jìn)_第1頁(yè)
抖音架構(gòu)演進(jìn)_第2頁(yè)
抖音架構(gòu)演進(jìn)_第3頁(yè)
抖音架構(gòu)演進(jìn)_第4頁(yè)
抖音架構(gòu)演進(jìn)_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

抖音架構(gòu)演進(jìn)前言介紹2016.09.26,抖音版本1.0.0上線,隨后不斷迭代優(yōu)化和豐富產(chǎn)品,截止目前,抖音日活躍用戶突破6億,短短4年間,抖音從零爆發(fā)性增長(zhǎng)??焖俚臉I(yè)務(wù)發(fā)展也對(duì)技術(shù)支撐提出了更高的要求,為了保障敏捷的業(yè)務(wù)開發(fā),提升跨團(tuán)隊(duì)的協(xié)同合作效率,提高本地研發(fā)和

CI/CD效率,抖音iOS

App工程架構(gòu)在不同的階段進(jìn)行了不同的技術(shù)方案的改進(jìn),滿足合理的架構(gòu)演化,同時(shí)又不影響正常的業(yè)務(wù)迭代速度。抖音工程架構(gòu)演進(jìn)合理的架構(gòu)設(shè)計(jì)可以解決大型項(xiàng)目跨團(tuán)隊(duì)協(xié)作分工和多業(yè)務(wù)線并行開發(fā)的效率問題。抖音工程代碼從一開始就采用了組件化思路,依賴管理工具是定制版的Cocoapods。組件化在大型項(xiàng)目快速發(fā)展的過(guò)程中,要保證敏捷開發(fā)迭代的最大障礙就是快速膨脹的代碼體積導(dǎo)致的編譯效率問題,依賴關(guān)系復(fù)雜化問題,以及業(yè)務(wù)線代碼沖突問題。移動(dòng)端項(xiàng)目可以類比后端項(xiàng)目中采用的微服務(wù)架構(gòu),要解決多業(yè)務(wù)線并行開發(fā)、并行測(cè)試問題,采用流水

線式迭代開發(fā),提高發(fā)版、集成、交付、提審、發(fā)布效率,結(jié)合分治思想技術(shù)選型上可以采用組件化的方案。大部分小型項(xiàng)目,組件化僅僅做到代碼分倉(cāng),使用Cocoapods的來(lái)管理組件依賴,就像抖音項(xiàng)目最初的工程形態(tài)。但是對(duì)于幾百號(hào)人、幾十個(gè)業(yè)務(wù)線規(guī)模的大型項(xiàng)目,需要設(shè)計(jì)一套合理的組件分層架構(gòu),理清組件間依賴關(guān)系,需要CI/CD工具鏈支撐組件發(fā)版與集成,需要本地研發(fā)工具支撐本地代碼同步、工程配置、依賴管理和效率優(yōu)化。抖音工程架構(gòu)演進(jìn)流水線式迭代開發(fā)流水線(pipeline)技術(shù)是指在程序執(zhí)行時(shí)多條指令重疊進(jìn)行操作的一種準(zhǔn)并行實(shí)現(xiàn)技術(shù),該技術(shù)可以充分提高資源的利用率,同時(shí)縮短產(chǎn)品的研發(fā)周期。對(duì)于客戶端項(xiàng)目,流水線技術(shù)能很大程度滿足敏捷開發(fā)迭代的節(jié)奏。01抖音原始工程架構(gòu)(Original

architecture

of

project)03單倉(cāng)多組件工程架構(gòu)(Multicomponents

in

single

repo)0204分離殼工程后的工程架構(gòu)(After

splitting

of

host

shell

pod)Example子殼工程架構(gòu)(Subshell

for

bizcomponent

inexample

project)抖音工程架構(gòu)演進(jìn)抖音工程架構(gòu)演進(jìn)階段一:抖音原始工程架構(gòu)(Original

architecture

of

project)抖音項(xiàng)目一開始是單體架構(gòu)+Cocoapods,業(yè)務(wù)代碼、工程配置、資源文件全部放在一個(gè)大業(yè)務(wù)倉(cāng)庫(kù)。由

Podfile文件描述第三方倉(cāng)庫(kù)的依賴版本。抖音項(xiàng)目原始工程架構(gòu)圖抖音工程架構(gòu)演進(jìn)階段一:抖音原始工程架構(gòu)(Original

architecture

of

project)抖音項(xiàng)目一開始是單體架構(gòu)+Cocoapods,業(yè)務(wù)代碼、工程配置、資源文件全部放在一個(gè)大業(yè)務(wù)倉(cāng)庫(kù)。由

Podfile文件描述第三方倉(cāng)庫(kù)的依賴版本。抖音項(xiàng)目原始工程架目錄結(jié)構(gòu)抖音工程架構(gòu)演進(jìn)階段二:分離殼工程后的工程架構(gòu)(After

splitting

of

host

shell

pod)分離殼工程后,工程配置、部分系統(tǒng)資源、工程主入口被拆分到主宿主殼工程。部分基礎(chǔ)能力代碼被拆分成基礎(chǔ)倉(cāng)庫(kù),跟第三方倉(cāng)庫(kù)一樣獨(dú)立發(fā)版。本地研發(fā)工具支持單倉(cāng)開發(fā)和多倉(cāng)開發(fā),不參與代碼修改的倉(cāng)庫(kù)通過(guò)二進(jìn)制的方式進(jìn)行鏈接。同時(shí)

CI流程上也支持通過(guò)二進(jìn)制打測(cè)試包,提高打包效率。Podfile拆分出版本依賴管理文件Podfile.seer,由依賴管理平臺(tái)進(jìn)行各個(gè)版本的容器化管理,業(yè)務(wù)倉(cāng)跟隨宿主集

成發(fā)版,打平依賴,解決版本依賴決議

耗時(shí)問題。拆分殼工程后的工程架構(gòu)抖音工程架構(gòu)演進(jìn)階段二:分離殼工程后的工程架構(gòu)(After

splitting

of

host

shell

pod)Podfile拆分出版本依賴管理文件Podfile.seer,由依賴管理平臺(tái)進(jìn)行各個(gè)版本的容器化管理,業(yè)務(wù)倉(cāng)跟隨宿主集

成發(fā)版,打平依賴,解決版本依賴決議

耗時(shí)問題。大業(yè)務(wù)倉(cāng)中的代碼和資源被拆分到各個(gè)業(yè)務(wù)線的倉(cāng)庫(kù)下,由

podspec文件描述內(nèi)外依賴。業(yè)務(wù)線倉(cāng)庫(kù)增加

ModuleInterface

subspec,存放對(duì)外接口,采用依賴注入方式實(shí)現(xiàn)接口隔離,初步建立接口層。業(yè)務(wù)倉(cāng)庫(kù)之間規(guī)定只能依賴其他業(yè)務(wù)倉(cāng)庫(kù)的

ModuleInterface

subspec,通過(guò)lint進(jìn)行編譯檢查。抖音項(xiàng)目拆分殼工程后目錄結(jié)構(gòu)抖音工程架構(gòu)演進(jìn)階段二:分離殼工程后的工程架構(gòu)(After

splitting

of

host

shell

pod)殼工程為了滿足一個(gè)工程同時(shí)支持多個(gè)項(xiàng)目、部分業(yè)務(wù)線功能復(fù)用、部分業(yè)務(wù)線中臺(tái)化發(fā)展的需求,我們把所有業(yè)務(wù)線抽象成獨(dú)立的Pod,所有業(yè)務(wù)Pod必須通過(guò)宿主的殼工程進(jìn)行集成發(fā)版。殼工程包含了項(xiàng)目依賴的Pod信息描述,

同時(shí)還包括工程的配置、部分系統(tǒng)級(jí)別的資源文件、工程主入口代碼?;诙喾菟拗鳉すこ?,一份代碼可以打包出抖音、抖音極速版等項(xiàng)目。同時(shí),基于宿主殼工程,一些業(yè)務(wù)線可以通過(guò)自動(dòng)化同步生成自己的子殼工程,實(shí)現(xiàn)業(yè)務(wù)線自己的Example工程,進(jìn)行獨(dú)立開發(fā),比如有語(yǔ)音通話的Example工程,有工具的

Example工程,有直播的Example工程等等。殼工程抽象子殼工程配置同步同步抖音工程架構(gòu)演進(jìn)階段二:分離殼工程后的工程架構(gòu)(After

splitting

of

host

shell

pod)接口層接口層顧名思義,只提供依賴的抽象接口,所有接口都是

protocol協(xié)議聲明。接口層限制了所有其他依賴,類、枚舉、外部協(xié)議都采用前向聲明,podspec上只允許聲明對(duì)

DI(依賴注入)框架的依賴。接口層滿足封裝、隔離和組合的原則。業(yè)務(wù)層面對(duì)外封裝了實(shí)現(xiàn)代碼;

編譯層面隔離了組件間依賴傳遞,減少頭文件

import嵌套提高編譯緩存的命中率,對(duì)于

swift業(yè)務(wù)組件,還能達(dá)到減少編譯傳遞的問題;架構(gòu)層面聲明抽象協(xié)議支持接口組合;DI容器框架同時(shí)支持

stateless

DI容器,也支持

stateful

DI容器。抖音工程架構(gòu)演進(jìn)階段二:分離殼工程后的工程架構(gòu)(After

splitting

of

host

shell

pod)依賴打平

采用Cocoapods本身自帶的版本依賴決議進(jìn)行版本分析會(huì)消耗大量的時(shí)間;Podfile.lock過(guò)于繁瑣,可讀性很差,難以解決Podfile.lock的沖突;

隱式依賴被動(dòng)/不符合預(yù)期地升級(jí),難以確定性地聲明所有依賴,防止隱式依賴被升級(jí);

依賴版本在Podfile/Podfile.lock重復(fù)聲明,增加了解決沖突的成本;

Podfile.lock參與依賴版本決議流程比較復(fù)雜,會(huì)出現(xiàn)不符合預(yù)期的情況。

hook掉Cocoapods采用podfile.lock進(jìn)行版本決議的邏輯,采用Podfile.seer文件直接描述所有組件的版本信息,打平依賴。把版本管理和倉(cāng)庫(kù)源信息遷移到Podfile.seer文件抖音工程架構(gòu)演進(jìn)階段三:?jiǎn)蝹}(cāng)多組件工程架構(gòu)(Multicomponents

in

single

repo)采用單倉(cāng)多組件后,每個(gè)業(yè)務(wù)線倉(cāng)庫(kù)支持添加

podspec增加組件,實(shí)現(xiàn)更小粒度的二進(jìn)制依賴。業(yè)務(wù)線倉(cāng)庫(kù)內(nèi)劃分業(yè)務(wù)實(shí)現(xiàn)層、業(yè)務(wù)接口層、服務(wù)層和基礎(chǔ)層,都是通過(guò)集成方式發(fā)版。新增的服務(wù)層主要存放公共的業(yè)務(wù)邏輯和通用服務(wù),限制

UI。一、滿足業(yè)務(wù)邏輯復(fù)用;二、滿足子殼工程最小化二進(jìn)制依賴。拆分單倉(cāng)多組件后的工程架構(gòu)抖音工程架構(gòu)演進(jìn)階段三:?jiǎn)蝹}(cāng)多組件工程架構(gòu)(Multicomponents

in

single

repo)同時(shí)服務(wù)層的服務(wù)接口也達(dá)到隔離依賴傳遞的目的,在不同的宿主上,支持通過(guò)改變服務(wù)層實(shí)現(xiàn)替換后臺(tái)能力或者底層能力。建立分層間的依賴準(zhǔn)入規(guī)則,完善

lint編譯鏈接檢查。編譯鏈接完備性校驗(yàn)編譯校驗(yàn):分開編譯各個(gè)

subspec,確保每個(gè)subspec的依賴是正確的(由于

subspec沒有編譯隔離)接口符號(hào)校驗(yàn):校驗(yàn)當(dāng)前接口組件(ModuleInterface)中符號(hào)是否完備的,以保證其他組件單獨(dú)引用是否能正常使用。如

extern聲明的全局變量。單倉(cāng)多組件目錄結(jié)構(gòu)抖音工程架構(gòu)演進(jìn)階段三:?jiǎn)蝹}(cāng)多組件工程架構(gòu)(Multicomponents

in

single

repo)分層依賴準(zhǔn)入規(guī)則:高層依賴低層實(shí)現(xiàn)依賴接口接口層無(wú)依賴前向聲明優(yōu)先服務(wù)層去"UI"業(yè)務(wù)實(shí)現(xiàn)層和服務(wù)實(shí)現(xiàn)允許依賴的分層抖音工程架構(gòu)演進(jìn)階段四:Example子殼工程架構(gòu)(Subshell

for

bizcomponent

in

example

project)每個(gè)業(yè)務(wù)倉(cāng)從宿主同步工程配置構(gòu)建子殼工程。增加

AWELaunchKit為子

殼工程提供運(yùn)行時(shí)的基礎(chǔ)能力。通過(guò)服務(wù)層提供業(yè)務(wù)間運(yùn)行時(shí)共享的服務(wù)能力,滿足代碼復(fù)用和更小二進(jìn)制依賴。子殼工程架構(gòu)抖音工程架構(gòu)演進(jìn),階段四:Example子殼工程架構(gòu)(Subshell

for

bizcomponent

in

example

project)每個(gè)業(yè)務(wù)倉(cāng)從宿主同步工程配置構(gòu)建子殼工程。增加

AWELaunchKit為子

殼工程提供運(yùn)行時(shí)的基礎(chǔ)能力。通過(guò)服務(wù)層提供業(yè)務(wù)間運(yùn)行時(shí)共享的服務(wù)能力滿足代碼復(fù)用和更小二進(jìn)制依賴。子殼工程目錄結(jié)構(gòu)抖音工程架構(gòu)演進(jìn)。階段四:Example子殼工程架構(gòu)(Subshell

for

bizcomponent

in

example

project)AWELaunchKitAWELaunchKit框架為宿主和其他子殼工程提供了基礎(chǔ)服務(wù)的依賴和初始化配置同時(shí)提供了一套啟動(dòng)加載的

BootTasks

管理框架,部分業(yè)務(wù)涉及啟動(dòng)相關(guān)的邏輯可以在業(yè)務(wù)倉(cāng)對(duì)應(yīng)的服務(wù)層中實(shí)現(xiàn),并通過(guò)

BootTasks管理框架注冊(cè)到啟動(dòng)加載器里面。同時(shí)框架還提供了一套宿主

UI入口和自定義入口框架。為了方便測(cè)試和調(diào)試,也整合了整套測(cè)試調(diào)試框架。子殼工程依賴關(guān)系抖音工程架構(gòu)演進(jìn)組件化探索過(guò)程中遇到的一些問題:二進(jìn)制污染組件之間的依賴除了顯式的依賴,還存在很多隱式依賴,代碼層面,除了普通的接口依賴,還有宏依賴、枚舉依

賴、全局變量依賴以及內(nèi)聯(lián)函數(shù)等的依賴。單倉(cāng)

lint進(jìn)行編譯鏈接完備性檢查并不能解決依賴變動(dòng)對(duì)其他二進(jìn)制的影響。因此需要借助源碼層面的依賴分析,判斷當(dāng)前組件的變更對(duì)其他依賴當(dāng)前組件的二進(jìn)制是否有影響,在

CI流程中及時(shí)發(fā)現(xiàn)并攔截。否則錯(cuò)誤的二進(jìn)制發(fā)版,會(huì)直接導(dǎo)致整個(gè)

CI研發(fā)流程和本地研發(fā)都受到影響。編譯優(yōu)化編譯優(yōu)化最高效的方式就是提高緩存的利用率。對(duì)于本地研發(fā)和CI流程,都涉及分布式編譯緩存同步。同時(shí)通過(guò)編譯參數(shù)優(yōu)化、依賴優(yōu)化、hmap優(yōu)化也能不同程度的提高編譯效率主干分支穩(wěn)定性問題對(duì)于多業(yè)務(wù)線并行開發(fā),幾百號(hào)人的業(yè)務(wù)開發(fā)團(tuán)隊(duì),如果主干分支一旦出現(xiàn)問題,那么解決問題的時(shí)間就需要乘上幾百倍。因此,需要從編譯層面和運(yùn)行層面都要有足夠的機(jī)制去保證一個(gè)穩(wěn)定的主干分支,才能保證業(yè)務(wù)側(cè)的長(zhǎng)期穩(wěn)定性。抖音工程架構(gòu)演進(jìn)組件化探索過(guò)程中遇到的一些問題:業(yè)務(wù)層的依賴耦合問題大型項(xiàng)目動(dòng)則千萬(wàn)行的代碼,代碼間的依賴關(guān)系是復(fù)雜的網(wǎng)狀關(guān)系。需要基于代碼的語(yǔ)法樹模型,從語(yǔ)義中去分析不合理的依賴,并輸出治理的方案。因此內(nèi)部自研了源碼依賴關(guān)系分析平臺(tái)用于依賴關(guān)系分析監(jiān)控和代碼治理,長(zhǎng)期監(jiān)控組件間的依賴度。同時(shí),需要建立依賴健康度模型,從長(zhǎng)期演進(jìn)的角度去監(jiān)控防止代碼的劣化。spider組件依賴分析平臺(tái)總結(jié)大型項(xiàng)目的組件化工作是一個(gè)系統(tǒng)性工程。涉及工程架構(gòu)的改造、CI/CD研發(fā)工具鏈的支撐、本地研發(fā)工具鏈的支撐,業(yè)務(wù)架構(gòu)的設(shè)計(jì)優(yōu)化,需要從各個(gè)方面綜合考慮成本和收益。沒有最好的架構(gòu),只有更好的架構(gòu),在架構(gòu)演進(jìn)的過(guò)程中,需要充

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論