互聯(lián)網(wǎng)架構(gòu)“高并發(fā)”到底怎么玩苦掘?

什么是高并發(fā)?

高并發(fā)(High Concurrency)是互聯(lián)網(wǎng)分布式系統(tǒng)架構(gòu)設(shè)計(jì)中必須考慮的因素之一楔壤,它通常是指鹤啡,通過設(shè)計(jì)保證系統(tǒng)能夠同時(shí)并行處理很多請求。

高并發(fā)相關(guān)的常見指標(biāo)有哪些蹲嚣?

  • 響應(yīng)時(shí)間(Response Time)
  • 吞吐量(Throughput)
  • 每秒查詢率QPS(Query Per Second)
  • 并發(fā)用戶數(shù)

什么是響應(yīng)時(shí)間递瑰?

系統(tǒng)對請求做出響應(yīng)的時(shí)間。

例如:系統(tǒng)處理一個(gè)HTTP請求需要200ms隙畜,這個(gè)200ms就是系統(tǒng)的響應(yīng)時(shí)間抖部。

什么是吞吐量?

單位時(shí)間內(nèi)處理的請求數(shù)量议惰。

什么是QPS慎颗?

每秒響應(yīng)請求數(shù)。在互聯(lián)網(wǎng)領(lǐng)域,這個(gè)指標(biāo)和吞吐量區(qū)分的沒有這么明顯俯萎。

什么是并發(fā)用戶數(shù)傲宜?

同時(shí)承載正常使用系統(tǒng)功能的用戶數(shù)量。

例如:一個(gè)即時(shí)通訊系統(tǒng)夫啊,同時(shí)在線量一定程度上代表了系統(tǒng)的并發(fā)用戶數(shù)函卒。

如何提升系統(tǒng)的并發(fā)能力?

互聯(lián)網(wǎng)分布式架構(gòu)設(shè)計(jì)撇眯,提高系統(tǒng)并發(fā)能力的方式报嵌,方法論上主要有兩種:

  • 垂直擴(kuò)展(Scale Up)
  • 水平擴(kuò)展(Scale Out)

什么是垂直擴(kuò)展?

垂直擴(kuò)展是指叛本,提升單機(jī)處理能力沪蓬,垂直擴(kuò)展的方式又有兩種:

(1)增強(qiáng)單機(jī)硬件性能,例如:增加CPU核數(shù)如32核来候,升級更好的網(wǎng)卡如萬兆跷叉,升級更好的硬盤如SSD,擴(kuò)充硬盤容量如2T营搅,擴(kuò)充系統(tǒng)內(nèi)存如128G云挟;

(2)提升單機(jī)架構(gòu)性能,例如:使用Cache來減少IO次數(shù)转质,使用異步來增加單服務(wù)吞吐量园欣,使用無鎖數(shù)據(jù)結(jié)構(gòu)來減少響應(yīng)時(shí)間;

畫外音:在互聯(lián)網(wǎng)業(yè)務(wù)發(fā)展非常迅猛的早期休蟹,如果預(yù)算不是問題沸枯,強(qiáng)烈建議使用“增強(qiáng)單機(jī)硬件性能”的方式提升系統(tǒng)并發(fā)能力,因?yàn)檫@個(gè)階段赂弓,公司的戰(zhàn)略往往是發(fā)展業(yè)務(wù)搶時(shí)間绑榴,而“增強(qiáng)單機(jī)硬件性能”往往是最快的方法。

垂直擴(kuò)展有什么瓶頸盈魁?

不管是提升單機(jī)硬件性能翔怎,還是提升單機(jī)架構(gòu)性能,都有一個(gè)致命的不足:單機(jī)性能總是有極限的杨耙。

如何突破單機(jī)的極限赤套?

互聯(lián)網(wǎng)分布式架構(gòu)設(shè)計(jì),高并發(fā)終極解決方案還是水平擴(kuò)展珊膜。

什么是水平擴(kuò)展容握?

只要增加服務(wù)器數(shù)量,就能線性擴(kuò)充系統(tǒng)性能车柠。

常見的互聯(lián)網(wǎng)分層架構(gòu)如何唯沮?

各層該如何落地水平擴(kuò)展脖旱?

image

常見互聯(lián)網(wǎng)分布式架構(gòu)如上,分為:

(1)客戶端層:典型調(diào)用方是瀏覽器browser或者手機(jī)應(yīng)用APP介蛉;

(2)反向代理層:系統(tǒng)入口萌庆,反向代理;

(3)站點(diǎn)應(yīng)用層:實(shí)現(xiàn)核心應(yīng)用邏輯币旧,返回html或者json践险;

(4)服務(wù)層:如果實(shí)現(xiàn)了服務(wù)化,就有這一層吹菱;

(5)數(shù)據(jù)-緩存層:緩存加速訪問存儲(chǔ)巍虫;

(6)數(shù)據(jù)-數(shù)據(jù)庫層:數(shù)據(jù)庫固化數(shù)據(jù)存儲(chǔ);

要想真?zhèn)€系統(tǒng)支持水平擴(kuò)展鳍刷,就必須每一層都支持水平擴(kuò)展占遥。

反向代理層如何進(jìn)行水平擴(kuò)展?

image

反向代理層的水平擴(kuò)展输瓜,是通過“DNS輪詢”實(shí)現(xiàn)的:dns-server對于一個(gè)域名配置了多個(gè)解析ip瓦胎,每次DNS解析請求來訪問dns-server,會(huì)輪詢返回這些ip尤揣。

當(dāng)nginx成為瓶頸的時(shí)候搔啊,只要增加服務(wù)器數(shù)量,新增nginx服務(wù)的部署北戏,增加一個(gè)外網(wǎng)ip负芋,就能擴(kuò)展反向代理層的性能,做到理論上的無限高并發(fā)嗜愈。

站點(diǎn)層如何進(jìn)行水平擴(kuò)展旧蛾?

image

站點(diǎn)層的水平擴(kuò)展,是通過“nginx”實(shí)現(xiàn)的蠕嫁,通過修改nginx.conf锨天,可以設(shè)置多個(gè)web后端。

畫外音:nginx是個(gè)例子拌阴,有可能是LVS或者F5等反向代理。

當(dāng)web后端成為瓶頸的時(shí)候奶镶,只要增加服務(wù)器數(shù)量迟赃,新增web服務(wù)的部署,在nginx配置中配置上新的web后端厂镇,就能擴(kuò)展站點(diǎn)層的性能纤壁,做到理論上的無限高并發(fā)。

服務(wù)層如何進(jìn)行水平擴(kuò)展捺信?

image

服務(wù)層的水平擴(kuò)展酌媒,是通過“服務(wù)連接池”實(shí)現(xiàn)的欠痴。

站點(diǎn)層通過RPC-client調(diào)用下游的服務(wù)層RPC-server時(shí),RPC-client中的連接池會(huì)建立與下游服務(wù)多個(gè)連接秒咨,當(dāng)服務(wù)成為瓶頸的時(shí)候喇辽,只要增加服務(wù)器數(shù)量,新增服務(wù)部署雨席,在RPC-client處建立新的下游服務(wù)連接菩咨,就能擴(kuò)展服務(wù)層性能,做到理論上的無限高并發(fā)陡厘。

畫外音:如果需要優(yōu)雅的進(jìn)行服務(wù)層自動(dòng)擴(kuò)容抽米,這里可能需要配置中心里服務(wù)自動(dòng)發(fā)現(xiàn)功能的支持。

數(shù)據(jù)層如何進(jìn)行水平擴(kuò)展糙置?

在數(shù)據(jù)量很大的情況下云茸,數(shù)據(jù)層(緩存,數(shù)據(jù)庫)涉及數(shù)據(jù)的水平擴(kuò)展谤饭,將原本存儲(chǔ)在一臺(tái)服務(wù)器上的數(shù)據(jù)(緩存标捺,數(shù)據(jù)庫)水平拆分到不同服務(wù)器上去,以達(dá)到擴(kuò)充系統(tǒng)性能的目的网持。

互聯(lián)網(wǎng)數(shù)據(jù)層常見的水平拆分方式有這么幾種宜岛,以數(shù)據(jù)庫為例:

一、按照范圍水平拆分

image

每一個(gè)數(shù)據(jù)服務(wù)功舀,存儲(chǔ)一定范圍的數(shù)據(jù)萍倡,上圖為例:

  • user0庫,存儲(chǔ)uid范圍1-1kw
  • user1庫辟汰,存儲(chǔ)uid范圍1kw-2kw

這個(gè)方案的好處是:

(1)規(guī)則簡單列敲,service只需判斷一下uid范圍就能路由到對應(yīng)的存儲(chǔ)服務(wù);

(2)數(shù)據(jù)均衡性較好帖汞;

(3)比較容易擴(kuò)展戴而,可以隨時(shí)加一個(gè)uid[2kw,3kw]的數(shù)據(jù)服務(wù);

不足是:

(1)請求的負(fù)載不一定均衡翩蘸,一般來說所意,新注冊的用戶會(huì)比老用戶更活躍,大range的服務(wù)請求壓力會(huì)更大催首;

二扶踊、按照哈希水平拆分

image

每一個(gè)數(shù)據(jù)庫,存儲(chǔ)某個(gè)key值hash后的部分?jǐn)?shù)據(jù)郎任,上圖為例:

  • user0庫秧耗,存儲(chǔ)偶數(shù)uid數(shù)據(jù)
  • user1庫,存儲(chǔ)奇數(shù)uid數(shù)據(jù)

這個(gè)方案的好處是:

(1)規(guī)則簡單舶治,service只需對uid進(jìn)行hash能路由到對應(yīng)的存儲(chǔ)服務(wù)分井;

(2)數(shù)據(jù)均衡性較好车猬;

(3)請求均勻性較好;

不足是:

(1)不容易擴(kuò)展尺锚,擴(kuò)展一個(gè)數(shù)據(jù)服務(wù)珠闰,hash方法改變時(shí)候,可能需要進(jìn)行數(shù)據(jù)遷移缩麸;

通過水平拆分來擴(kuò)充系統(tǒng)性能铸磅,與主從同步讀寫分離來擴(kuò)充數(shù)據(jù)庫性能,有什么本質(zhì)的不同杭朱?

畫外音:這兩個(gè)方案千萬別搞混阅仔。

通過水平拆分?jǐn)U展數(shù)據(jù)庫性能

(1)每個(gè)服務(wù)器上存儲(chǔ)的數(shù)據(jù)量是總量的1/n,所以單機(jī)的性能也會(huì)有提升弧械;

(2)n個(gè)服務(wù)器上的數(shù)據(jù)沒有交集八酒,那個(gè)服務(wù)器上數(shù)據(jù)的并集是數(shù)據(jù)的全集;

(3)數(shù)據(jù)水平拆分到了n個(gè)服務(wù)器上刃唐,理論上讀性能擴(kuò)充了n倍羞迷,寫性能也擴(kuò)充了n倍(其實(shí)遠(yuǎn)不止n倍,因?yàn)閱螜C(jī)的數(shù)據(jù)量變?yōu)榱嗽瓉淼?/n)画饥;

通過主從同步讀寫分離擴(kuò)展數(shù)據(jù)庫性能

(1)每個(gè)服務(wù)器上存儲(chǔ)的數(shù)據(jù)量是和總量相同衔瓮;

(2)n個(gè)服務(wù)器上的數(shù)據(jù)都一樣,都是全集抖甘;

(3)理論上讀性能擴(kuò)充了n倍热鞍,寫仍然是單點(diǎn),寫性能不變衔彻;

緩存層的水平拆分和數(shù)據(jù)庫層的水平拆分類似薇宠,也是以范圍拆分和哈希拆分的方式居多,就不再展開艰额。

總結(jié)

高并發(fā)(High Concurrency)是互聯(lián)網(wǎng)分布式系統(tǒng)架構(gòu)設(shè)計(jì)中必須考慮的因素之一澄港,它通常是指,通過設(shè)計(jì)保證系統(tǒng)能夠同時(shí)并行處理很多請求柄沮。

提高系統(tǒng)并發(fā)能力的方法主要有兩種:

  • 垂直擴(kuò)展(Scale Up)
  • 水平擴(kuò)展(Scale Out)

前者垂直擴(kuò)展可以通過提升單機(jī)硬件性能回梧,或者提升單機(jī)架構(gòu)性能,來提高并發(fā)性祖搓,但單機(jī)性能總是有極限的狱意,互聯(lián)網(wǎng)分布式架構(gòu)設(shè)計(jì)高并發(fā)終極解決方案還是后者:水平擴(kuò)展。

互聯(lián)網(wǎng)分層架構(gòu)中棕硫,各層次水平擴(kuò)展的實(shí)踐又有所不同:

(1)反向代理層可以通過“DNS輪詢”的方式來進(jìn)行水平擴(kuò)展髓涯;

(2)站點(diǎn)層可以通過nginx來進(jìn)行水平擴(kuò)展袒啼;

(3)服務(wù)層可以通過服務(wù)連接池來進(jìn)行水平擴(kuò)展哈扮;

(4)數(shù)據(jù)庫可以按照數(shù)據(jù)范圍纬纪,或者數(shù)據(jù)哈希的方式來進(jìn)行水平擴(kuò)展;

各層實(shí)施水平擴(kuò)展后滑肉,能夠通過增加服務(wù)器數(shù)量的方式來提升系統(tǒng)的性能包各,做到理論上的性能無限。

思路比結(jié)論重要靶庙。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末问畅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子六荒,更是在濱河造成了極大的恐慌护姆,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掏击,死亡現(xiàn)場離奇詭異卵皂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)砚亭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門灯变,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人捅膘,你說我怎么就攤上這事添祸。” “怎么了寻仗?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵刃泌,是天一觀的道長。 經(jīng)常有香客問我愧沟,道長蔬咬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任沐寺,我火速辦了婚禮林艘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘混坞。我一直安慰自己狐援,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布究孕。 她就那樣靜靜地躺著啥酱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪厨诸。 梳的紋絲不亂的頭發(fā)上镶殷,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機(jī)與錄音微酬,去河邊找鬼绘趋。 笑死颤陶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的陷遮。 我是一名探鬼主播滓走,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼帽馋!你這毒婦竟也來了搅方?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤绽族,失蹤者是張志新(化名)和其女友劉穎姨涡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吧慢,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绣溜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了娄蔼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怖喻。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖岁诉,靈堂內(nèi)的尸體忽然破棺而出锚沸,到底是詐尸還是另有隱情,我是刑警寧澤涕癣,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布哗蜈,位于F島的核電站,受9級特大地震影響坠韩,放射性物質(zhì)發(fā)生泄漏距潘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一只搁、第九天 我趴在偏房一處隱蔽的房頂上張望音比。 院中可真熱鬧,春花似錦氢惋、人聲如沸洞翩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骚亿。三九已至,卻和暖如春熊赖,著一層夾襖步出監(jiān)牢的瞬間来屠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留俱笛,地道東北人绣檬。 一個(gè)月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像嫂粟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子墨缘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容