高并發(fā)系統(tǒng):它的通用設(shè)計方法是什么?
在高并發(fā)系統(tǒng)的設(shè)計中,面對大流量的挑戰(zhàn),我們通常需要運用一些巧妙的方案來有效地分流和處理這些流量,從而保證系統(tǒng)的穩(wěn)定性和用戶體驗。可以通過一個比喻來幫助理解:就像古代治水一樣,我們在高并發(fā)系統(tǒng)中采用的策略,也旨在將洪水引流、分擔(dān)壓力、提高系統(tǒng)的承載能力。
例如,在古代的治水實踐中,大禹通過拓寬河道清除淤沙,讓水流更加順暢;都江堰則利用引流技術(shù)將岷江的水分流到多個支流,從而減少水流的壓力;而三門峽和葛洲壩通過建造水庫來暫時存儲水源,再通過控制水庫的排水來緩解下游的水患。這些治水的思想,實際上在現(xiàn)代高并發(fā)系統(tǒng)的設(shè)計中也能找到類似的解決方案。
總結(jié)起來,處理高并發(fā)的流量,我們主要會采取三種策略:
- 橫向擴(kuò)展(Scale-out):類似于“分而治之”的治水方法。通過分布式部署,將流量分散到不同的服務(wù)器或節(jié)點上,從而避免單一節(jié)點的過載,確保系統(tǒng)的可擴(kuò)展性和負(fù)載均衡。
- 緩存:就像是“拓寬河道”,緩存是緩解流量沖擊的一種有效方式。通過在系統(tǒng)中緩存熱點數(shù)據(jù),可以減少后端系統(tǒng)的壓力,提高響應(yīng)速度,從而提升用戶體驗。
- 異步處理:這種方式就像是“提前引流”或“暫存水源”。在一些場景下,我們可以允許請求先返回,并在數(shù)據(jù)準(zhǔn)備好之后再通知請求方。這種方式能夠有效提高系統(tǒng)的吞吐量,減少高并發(fā)時的響應(yīng)延遲。
這三種策略是高并發(fā)系統(tǒng)設(shè)計中常見的手段,當(dāng)然,每種方法背后還有更為復(fù)雜和細(xì)化的技術(shù)細(xì)節(jié),之后會根據(jù)具體場景進(jìn)一步講解。這些策略的靈活運用,可以幫助我們設(shè)計出既高效又可靠的高并發(fā)系統(tǒng),確保系統(tǒng)在面對大流量時能夠從容應(yīng)對。
首先,我們先來了解第一種方法:Scale-out。
Scale-up vs Scale-out
“摩爾定律”由Intel創(chuàng)始人之一戈登·摩爾在1965年提出,最初是指集成電路上晶體管的數(shù)量大約每兩年會翻一倍。這一理論后來被Intel CEO大衛(wèi)·豪斯用“18個月翻一倍”的說法進(jìn)一步簡化,并廣泛流傳。摩爾定律主要描述了芯片技術(shù)的發(fā)展速度,但它也可以延伸到整體硬件性能的提升。從20世紀(jì)下半葉開始,計算機(jī)硬件的性能一直呈現(xiàn)指數(shù)級的增長,這一趨勢持續(xù)至今。摩爾定律指引下的技術(shù)突破,使得我們從最初只有十幾個晶體管的集成電路,到今天每顆芯片上擁有數(shù)十億晶體管,芯片廠商在有限的空間內(nèi),通過減小晶體管的尺寸,不斷提升硬件性能。
然而,隨著芯片工藝的進(jìn)步,已有專家預(yù)測摩爾定律可能會在未來幾年失效。如今的芯片已經(jīng)進(jìn)入了5nm制程,進(jìn)一步減小晶體管尺寸的空間變得非常有限,可能無法繼續(xù)以每18個月翻倍的速度提升性能。在這種背景下,雙核和多核技術(shù)的出現(xiàn)為延續(xù)摩爾定律的理念提供了新的方向。通過將多個CPU核心集成到同一芯片上,CPU的并行處理能力得到了大幅提升,這一思路在高并發(fā)系統(tǒng)設(shè)計中也得到了應(yīng)用。
在高并發(fā)系統(tǒng)中,類似于摩爾定律不斷提升單機(jī)性能的做法,被稱為Scale-up(縱向擴(kuò)展)。而將多個處理單元組合成一個集群來提升性能,則被稱為Scale-out(橫向擴(kuò)展)。這兩者在實現(xiàn)方式上有著明顯不同。
- Scale-up(縱向擴(kuò)展):這種方式類似于提升單個CPU的核心數(shù),通過購買更高性能的硬件來提高系統(tǒng)的處理能力。例如,如果一個4核4GB內(nèi)存的機(jī)器每秒能處理200次請求,那么通過將機(jī)器升級為8核8GB內(nèi)存,理論上就能處理更多的請求(盡管硬件提升的性能并非線性增長,這里只是舉例說明)。Scale-up的優(yōu)勢在于其簡單直接,適用于系統(tǒng)初期的擴(kuò)展。
- Scale-out(橫向擴(kuò)展):這種方式通過將多個低性能的機(jī)器組合成一個分布式集群,共同承擔(dān)高并發(fā)流量的壓力。例如,使用兩臺4核4GB內(nèi)存的機(jī)器來處理400次請求。這種方法能夠突破單機(jī)硬件的性能極限,但也帶來了一些復(fù)雜性,比如分布式系統(tǒng)的管理、負(fù)載均衡、數(shù)據(jù)一致性等問題。
在實際的系統(tǒng)設(shè)計中,通常在初期階段選擇Scale-up,因為它能夠通過提升單機(jī)硬件性能解決問題,操作簡單;但隨著系統(tǒng)并發(fā)量的增長,單機(jī)的性能瓶頸逐漸顯現(xiàn),Scale-out成為應(yīng)對更高并發(fā)流量的解決方案。盡管Scale-out具有更強(qiáng)的擴(kuò)展性,但也需要解決更復(fù)雜的技術(shù)挑戰(zhàn)。
說完了 Scale-out,我們再來看看高并發(fā)系統(tǒng)設(shè)計的另一種方法:緩存。
使用緩存提升性能
Web 2.0 被稱為“緩存的時代”,這一點幾乎是公認(rèn)的。如今,緩存已經(jīng)滲透到系統(tǒng)設(shè)計的各個層面,從操作系統(tǒng)到瀏覽器,從數(shù)據(jù)庫到消息隊列,任何稍微復(fù)雜的服務(wù)和組件中都能看到緩存的身影。緩存的主要作用是提高系統(tǒng)的訪問性能,尤其是在高并發(fā)場景中,緩存能顯著提升系統(tǒng)的響應(yīng)速度,從而支持更多用戶同時訪問。
那么,為什么緩存能大幅度提升系統(tǒng)的性能呢?我們知道,數(shù)據(jù)通常存儲在持久化存儲中,且大多數(shù)持久化存儲使用磁盤作為存儲介質(zhì)。傳統(tǒng)磁盤由機(jī)械手臂、磁頭、轉(zhuǎn)軸和盤片組成,盤片被劃分為多個同心圓,稱為磁道。這些磁道用來存儲數(shù)據(jù)。磁盤工作時,盤片高速旋轉(zhuǎn),機(jī)械手臂帶動磁頭沿著徑向移動,定位到需要讀取的磁道。在此過程中,磁頭找到數(shù)據(jù)的時間被稱為尋道時間,這是磁盤存取數(shù)據(jù)的瓶頸之一。
圖片
普通磁盤的尋道時間大約是10毫秒,而與此相比,CPU執(zhí)行指令和內(nèi)存尋址的速度通常在納秒(ns)級別,從千兆網(wǎng)卡讀取數(shù)據(jù)的時間則是在微秒(μs)級別。可以看出,磁盤在整個計算機(jī)系統(tǒng)中是最慢的組件,甚至比其他部件慢上幾個數(shù)量級。因此,為了提升性能,我們通常采用內(nèi)存作為存儲介質(zhì)來實現(xiàn)緩存。
緩存的作用不僅僅限于簡單的存儲,它的語義已經(jīng)變得更加豐富。在現(xiàn)代系統(tǒng)設(shè)計中,任何可以顯著降低響應(yīng)時間的中間存儲都可以被稱為緩存。例如,在操作系統(tǒng)中,CPU就有多級緩存來減少訪問主內(nèi)存的時間;文件系統(tǒng)中也有Page Cache緩存,用來提高文件讀取的效率。緩存的思想已經(jīng)廣泛應(yīng)用于多個領(lǐng)域,不僅限于傳統(tǒng)的數(shù)據(jù)庫緩存,而是滲透到計算機(jī)系統(tǒng)的方方面面。
異步處理
異步是一種常見的高并發(fā)設(shè)計方法,我們在很多技術(shù)文章和演講中常常會看到這個術(shù)語,同時它也經(jīng)常與“同步”相提并論。例如,在分布式服務(wù)框架Dubbo中,我們可以看到同步方法調(diào)用和異步方法調(diào)用;在IO模型中,也有同步IO和異步IO。那么,什么是同步,什么是異步呢?
以方法調(diào)用為例,同步調(diào)用意味著調(diào)用方必須等待被調(diào)用的方法執(zhí)行完成后才能繼續(xù)執(zhí)行下一步操作。在同步調(diào)用的情況下,如果被調(diào)用的方法響應(yīng)時間較長,調(diào)用方會一直阻塞,直到方法執(zhí)行完成。這種方式在高并發(fā)場景下會導(dǎo)致大量阻塞,最終可能引發(fā)整體系統(tǒng)性能下降,甚至發(fā)生“雪崩效應(yīng)”。
異步調(diào)用則正好相反,調(diào)用方不需要等待被調(diào)用方法的邏輯執(zhí)行完成,而是可以立刻返回并繼續(xù)執(zhí)行其他操作。當(dāng)被調(diào)用的方法完成后,結(jié)果會通過回調(diào)、事件通知等機(jī)制反饋給調(diào)用方。異步調(diào)用非常適合大規(guī)模高并發(fā)的系統(tǒng)中使用。例如,我們都知道的12306網(wǎng)站,訂票時頁面會顯示“系統(tǒng)正在排隊”的提示,這其實就表示系統(tǒng)在異步處理我們的訂票請求。
在12306系統(tǒng)中,查詢余票、下單、以及更新余票狀態(tài)等操作都是比較耗時的,可能涉及多個內(nèi)部系統(tǒng)的調(diào)用。如果這些操作是同步的,那么在高并發(fā)的情況下,就像12306剛上線時那樣,很多用戶在高峰期永遠(yuǎn)無法成功下單。而采用異步處理后,系統(tǒng)能夠更有效地分擔(dān)負(fù)載,提升整體處理能力和用戶體驗。
而采用異步的方式,后端處理時會把請求丟到消息隊列中,同時快速響應(yīng)用戶,告訴用戶我們正在排隊處理,然后釋放出資源來處理更多的請求。訂票請求處理完之后,再通知用戶訂票成功或者失敗。處理邏輯后移到異步處理程序中,Web 服務(wù)的壓力小了,資源占用的少了,自然就能接收更多的用戶訂票請求,系統(tǒng)承受高并發(fā)的能力也就提升了。
圖片
了解了這些方法后,我們可能會問,是否在高并發(fā)系統(tǒng)設(shè)計中就必須把這些方法都應(yīng)用到位?答案是否定的。系統(tǒng)設(shè)計是一個不斷演進(jìn)的過程,"羅馬不是一天建成的",系統(tǒng)的設(shè)計也是如此。不同規(guī)模的系統(tǒng)會面臨不同的痛點,進(jìn)而會有不同的架構(gòu)設(shè)計側(cè)重點。如果在一開始就按照百萬、千萬并發(fā)量來設(shè)計系統(tǒng),盲目追求像淘寶、微信那樣的架構(gòu),那么這些系統(tǒng)的命運很可能會是失敗的。
為什么呢?因為盡管像淘寶、微信這樣的大型系統(tǒng)能夠處理百萬、千萬并發(fā)的需求,但它們內(nèi)部的復(fù)雜性是我們難以想象的。盲目地追隨這些大系統(tǒng)的設(shè)計思路,只會讓我們的架構(gòu)變得異常復(fù)雜,最終導(dǎo)致難以維護(hù)和擴(kuò)展。比如說,淘寶在經(jīng)歷多年的發(fā)展后,才發(fā)現(xiàn)自己在整體擴(kuò)展能力上的瓶頸,這時他們才開始進(jìn)行服務(wù)化改造。
我自己也曾經(jīng)歷過類似的情況。在參與的一個創(chuàng)業(yè)項目中,我們在初期就選擇了服務(wù)化架構(gòu)。但由于當(dāng)時人力有限,團(tuán)隊的技術(shù)積累不足,在實際開發(fā)過程中我們發(fā)現(xiàn)無法駕馭如此復(fù)雜的架構(gòu),導(dǎo)致了很多問題:比如問題定位困難、系統(tǒng)性能下降,甚至系統(tǒng)宕機(jī)時都很難找到根本原因。最終,我們不得不將服務(wù)進(jìn)行整合,回歸到更簡單的單體架構(gòu)中。
這也提醒我們,在設(shè)計高并發(fā)系統(tǒng)時,必須根據(jù)實際的業(yè)務(wù)需求、技術(shù)儲備和團(tuán)隊能力來選擇合適的架構(gòu),并隨系統(tǒng)的發(fā)展不斷調(diào)整和優(yōu)化,而不是一開始就過于復(fù)雜化。
所以我建議一般系統(tǒng)的演進(jìn)過程應(yīng)該遵循下面的思路:
最初的系統(tǒng)設(shè)計應(yīng)當(dāng)以滿足當(dāng)前的業(yè)務(wù)需求和流量情況為目標(biāo),并選擇團(tuán)隊最熟悉的技術(shù)體系。在實際開發(fā)過程中,隨著流量的增加和業(yè)務(wù)的發(fā)展,我們可能會發(fā)現(xiàn)架構(gòu)中的一些問題,比如單點故障、橫向擴(kuò)展的瓶頸,或是性能無法滿足需求的組件。此時,我們需要逐步修正這些問題。
在解決問題時,我們首先會考慮選擇那些社區(qū)中已經(jīng)成熟并且團(tuán)隊熟悉的組件,這樣可以更高效地應(yīng)對問題并避免重復(fù)造輪子。如果社區(qū)沒有合適的解決方案,才會考慮自行開發(fā)或定制解決方案。
然而,當(dāng)對現(xiàn)有架構(gòu)進(jìn)行的小修小補(bǔ)已無法解決問題時,我們需要考慮更大規(guī)模的調(diào)整,如架構(gòu)重構(gòu)或重寫。通過這些更為深度的調(diào)整,才能有效解決現(xiàn)有架構(gòu)無法滿足業(yè)務(wù)需求的難題。總之,系統(tǒng)架構(gòu)的設(shè)計和演進(jìn)是一個不斷調(diào)整和優(yōu)化的過程,應(yīng)根據(jù)實際需求逐步推進(jìn)。
以淘寶為例,最初在業(yè)務(wù)從0到1的階段,淘寶通過購買現(xiàn)成的硬件和軟件快速搭建了系統(tǒng)。然而,隨著流量的不斷增長,淘寶開始進(jìn)行一系列的技術(shù)改造,以提高系統(tǒng)的高并發(fā)處理能力。這些改造包括將數(shù)據(jù)庫存儲引擎從MyISAM遷移到InnoDB,實施數(shù)據(jù)庫的分庫分表,增加緩存,并開發(fā)中間件等。當(dāng)這些優(yōu)化手段不再滿足需求時,淘寶進(jìn)一步對整體架構(gòu)進(jìn)行大規(guī)模重構(gòu),例如著名的“五彩石”項目,這使得淘寶的架構(gòu)從單體架構(gòu)逐步演進(jìn)為服務(wù)化架構(gòu)。
正是通過這些逐步的技術(shù)演進(jìn),淘寶才最終構(gòu)建了能夠支撐過億QPS的技術(shù)架構(gòu)。歸根結(jié)底,高并發(fā)系統(tǒng)的演進(jìn)應(yīng)當(dāng)是循序漸進(jìn)的,始終圍繞解決系統(tǒng)中存在的問題展開,技術(shù)的不斷演化和優(yōu)化才是推動架構(gòu)進(jìn)步的真正驅(qū)動力。