最近寫的《假如給我百倍流量》講稿

從三到萬。

這是一次務(wù)虛的分享,主要想介紹大型后端系統(tǒng)的架構(gòu)演進(jìn)方案,以及后續(xù)的思考。

世間普適的法則。

這個(gè)思想很重要,從CPU芯片到硬件到內(nèi)核到協(xié)議到應(yīng)用,幾乎涵蓋了所有計(jì)算機(jī)領(lǐng)域。本圖是緩存領(lǐng)域的多個(gè)層級(jí)。

Linux 內(nèi)核的層級(jí)。

OSI 協(xié)議的層級(jí)。

我們的項(xiàng)目經(jīng)過天使輪,開工了。

用 Python 開擼,大學(xué)生的水平。

項(xiàng)目干得不錯(cuò),融了 A 輪。用戶量增加后服務(wù)器 QPS 壓力增大。除了平攤 IO 壓力,另外一個(gè)考慮是為了平滑上線。不能每次上線期間服務(wù)都不可用是吧。

一般使用 Nginx。

負(fù)載均衡的基本概念。

繼續(xù)融資 B1 輪,用戶量繼續(xù)增長(zhǎng)。緩存也是很基礎(chǔ)的優(yōu)化方案。

一般使用 Redis。

緩存的一般意義。

繼續(xù)融資 B2 輪,業(yè)務(wù)增加了 LBS 的功能,需要用到 PostgreSQL + PostGIS 的能力。但是基于地理信息的數(shù)據(jù)不適合使用緩存,為了平攤壓力,引入讀寫分離。

左半邊服務(wù)器的 pg 連接沒有畫。

讀寫分離的基本概念。

項(xiàng)目長(zhǎng)足發(fā)展,融了 C1 輪的錢,用戶量也繼續(xù)上漲。產(chǎn)品設(shè)計(jì)了很多提交性的功能,為了減輕數(shù)據(jù)庫的寫壓力,引入了消息隊(duì)列,削峰填谷。

右邊服務(wù)器的 MQ 連接沒畫。

一般使用 Kafka,談?wù)?Kafak 高吞吐的實(shí)現(xiàn)方式。

繼續(xù)融資 C2 輪,用戶量繼續(xù)上漲,數(shù)據(jù)庫單機(jī)不論是存儲(chǔ)量還是吞吐量都已經(jīng)是瓶頸?,F(xiàn)在開始發(fā)大招:數(shù)據(jù)庫分庫分表。

分庫分表后的架構(gòu)。

分庫分表后的的概念,記住不要輕易使用,特別是在項(xiàng)目前期不要過度設(shè)計(jì)。

繼續(xù)融資 C3 輪,用戶量繼續(xù)上漲?,F(xiàn)有架構(gòu)已經(jīng) hold 不住了。

首先是數(shù)據(jù)庫連接數(shù)吃緊。

無法做資源隔離,作為一個(gè)開發(fā),可能自己的功能沒有問題,但是數(shù)據(jù)庫被別人拖掛,服務(wù)本身也可能被別人拖掛。

業(yè)務(wù)越多,整體架構(gòu)越復(fù)雜,微服務(wù)帶來的收益越大。
過早引入反而是增加開發(fā)和運(yùn)維的工作。

數(shù)據(jù)庫連接數(shù)減少。

整個(gè)身心都清爽了。

如果一個(gè)人負(fù)責(zé)太多微服務(wù),還不如他寫到一個(gè)服務(wù)里面。

勝利在前方,但是感覺架構(gòu)又拖了后腿。

Google 爸爸已經(jīng)幫你準(zhǔn)備好了。

不管什么語言什么框架寫的應(yīng)用(Go, Python, Node.js),Kubernetes 都可以在任何環(huán)境中安全的啟動(dòng)它,物理服務(wù)器、虛擬機(jī)、云環(huán)境。

Kubernetes 如果發(fā)現(xiàn)有節(jié)點(diǎn)工作不飽和,便會(huì)重新分配 pod,幫助我們節(jié)省開銷,高效的利用內(nèi)存、處理器等資源。
如果一個(gè)節(jié)點(diǎn)宕機(jī)了,Kubernetes 會(huì)自動(dòng)重新創(chuàng)建之前運(yùn)行在此節(jié)點(diǎn)上的 pod,在其他節(jié)點(diǎn)上運(yùn)行。

網(wǎng)絡(luò)、負(fù)載均衡、復(fù)制等特性,對(duì)于 Kubernetes 都是開箱即用的。
pod 是無狀態(tài)運(yùn)行的,任何時(shí)候有 pod 宕了,立馬會(huì)有其他 pod 接替它的工作,用戶完全感覺不到。
如果用戶量突然暴增,現(xiàn)有的 pod 規(guī)模不足了,那么會(huì)自動(dòng)創(chuàng)建出一批新的 pod,以適應(yīng)當(dāng)前的需求。
反之亦然,當(dāng)負(fù)載降下來的時(shí)候,Kubernetes 也會(huì)自動(dòng)縮減 pod 的數(shù)量。

利用鏡像,從開發(fā)到調(diào)試到上線一條龍,酸爽。

Kubernetes 如此流行的一個(gè)重要原因是:應(yīng)用會(huì)一直順利運(yùn)行,不會(huì)被 pod 或 節(jié)點(diǎn)的故障所中斷。
如果出現(xiàn)故障,Kubernetes 會(huì)創(chuàng)建必要數(shù)量的應(yīng)用鏡像,并分配到健康的 pod 或節(jié)點(diǎn)中,直到系統(tǒng)恢復(fù)。

完善后的架構(gòu)。

如果繼續(xù)發(fā)展呢?

上面一排是指導(dǎo)思想,下面一排是具體方案。

計(jì)算機(jī)領(lǐng)域很重要的思想。

也是很重要的思想。

如果僅用一句話來形容高并發(fā)、高可用?副本足以。

IO 復(fù)用是節(jié)約進(jìn)程這個(gè)資源,讓單個(gè)進(jìn)程可以監(jiān)聽多個(gè) fd。

也就是說不要無端提高系統(tǒng)復(fù)雜度。

展開分析。

單元化的實(shí)現(xiàn)。針對(duì)流水型數(shù)據(jù),在本單元就消化完成了。
把分流的動(dòng)作提前到網(wǎng)關(guān)處。

針對(duì)共享型數(shù)據(jù),則涉及到跨地區(qū)的訪問。比如三地五中心這種經(jīng)典架構(gòu)。

異地災(zāi)備的基礎(chǔ)是,其他地區(qū)的數(shù)據(jù)也要進(jìn)行冗余存儲(chǔ)。

服務(wù)治理的進(jìn)化方向,此處無法展開。

除了 MySQL 和 PostgreqSQL 我們還有啥。

跨領(lǐng)域的結(jié)合。

期待量子計(jì)算機(jī)。
