什么叫高并發(fā)?
本文公眾號來源:禿頭和尚 作者:和尚 本文已收錄至我的GitHub
首先拋出一個點(diǎn),我們?yōu)槭裁磳W(xué)高并發(fā)設(shè)計?
很實(shí)在的就是你找工作面試必問點(diǎn) 天天被叫做 CRUD boy,但是我們在高并發(fā)的情況下寫好 CRUD 并不容易
高并發(fā)是什么?
**高并發(fā)(**High Concurrency)是互聯(lián)網(wǎng)分布式系統(tǒng)架構(gòu)設(shè)計中必須考慮的因素之一,它通常是指,通過設(shè)計保證系統(tǒng)能夠同時并行處理很多請求。
高并發(fā)相關(guān)常用的一些指標(biāo)有響應(yīng)時間(Response Time),吞吐量(Throughput),每秒查詢率QPS(Query Per Second),每秒事務(wù)處理量TPS(Transaction Per Second),并發(fā)用戶數(shù)等。
這里不細(xì)提這些指標(biāo)的含義,不了解的可以 Google。
現(xiàn)在問題來了,多少 QPS 才算高并發(fā)?
看下面這段話之前,歡迎大家先去 Google 上搜一下這個答案,看看是否有具體的數(shù)據(jù)?
其實(shí)這個問題怎么沒有具體的數(shù)據(jù)來衡量什么才是高并發(fā)?
比如:
就一個服務(wù)部署在單機(jī)上,一次請求就訪問一個服務(wù),抗住的 QPS 肯定很高 但是如果是多個分布式服務(wù),一次請求需要訪問多個全鏈路服務(wù),這時候 QPS 又跟業(yè)務(wù)服務(wù)數(shù)量等強(qiáng)相關(guān)
所以具體多少 QPS 才算高并發(fā)其實(shí)跟業(yè)務(wù)是強(qiáng)相關(guān)的。
高并發(fā)設(shè)計真的就只是 synchronized、lock 這些嗎?
經(jīng)常也看見很多內(nèi)容標(biāo)題是《高并發(fā) xxx》,然后點(diǎn)進(jìn)去一看,就是講 synchronized、volatile 等等,其實(shí)個人覺得這些點(diǎn)只能算并發(fā)編程設(shè)計等,不能算到高并發(fā)設(shè)計里。
明確幾點(diǎn),高并發(fā)系統(tǒng)比較關(guān)注的點(diǎn)
可用性,系統(tǒng)在高并發(fā)情況下不能被流量打掛,
穩(wěn)定性,系統(tǒng)肯定不能出現(xiàn)一會好用,一會不好用的情況
高性能,比如
淘寶的雙 11 活動,如果你 0.00 下單一直卡在哪里,等了 1 分鐘,然后才告訴你要買的東西沒貨了。
每個月的花唄還款日,還款處理中,等了 1 分鐘告訴你還款成功/失敗

正題來了,高并發(fā)系統(tǒng)的通用設(shè)計方法是什么?
其實(shí)到了這里,很多人肯定就會說,分布式一致性怎么做、緩存一致性怎么做、Nginx 負(fù)載均衡怎么做、熔斷限流怎么做,叭叭叭。
但是這里不講具體高并發(fā)系統(tǒng)下的細(xì)節(jié),這里只分享通用設(shè)計方法,這些設(shè)計方法可以讓你對于高并發(fā)系統(tǒng)的設(shè)計有一個大的骨架,就像修房子一樣,先有一個大體的房子架構(gòu)圖,再去考慮到房子里怎么裝修,這些方法同理如此。
我們可以把高并發(fā)設(shè)計比喻為:大家去火車站坐火車,火車站進(jìn)站開多個進(jìn)站窗口驗(yàn)身份證和票,安檢傳送帶東西太多需要等待,那可以把安檢傳送帶設(shè)計寬一點(diǎn)放更多的東西,安檢人數(shù)過多,讓后面的人在卡點(diǎn)等一下,等前面的人安檢完畢再慢慢放人。
橫向擴(kuò)展
只要學(xué)過算法的我們,肯定知道分而治之這個點(diǎn),分而治之這個點(diǎn)同理在高并發(fā)系統(tǒng)設(shè)計里通用,
當(dāng)大流量打到系統(tǒng)所在機(jī)器上的時候,我們可以把機(jī)器的配置升高,比如4 核 8g 的電腦帶不上吃雞,那我們就可以升級到 8 核 16g,這里就堆硬件配置來解決問題,但是如果當(dāng)我們的流量超過了一臺機(jī)器配置的極限的時候,我們又該怎么做?
我們可以拿多個機(jī)器來處理這些流量,我們可以把多個機(jī)器組成一個分布式集群來進(jìn)行處理這些流量,這樣的話流量就分?jǐn)偟矫總€機(jī)器上去了,當(dāng)然可能很多人就會問:機(jī)器掛了怎么辦?分布式一致性怎么做?怎么讓流量到服務(wù)器上?這里不談這些,因?yàn)檫@些點(diǎn)約談越深,根本出不來。
這里談的橫向擴(kuò)展包含了很多點(diǎn),比如系統(tǒng)主服務(wù)扛不住可以加機(jī)器,數(shù)據(jù)庫扛不住也可以加機(jī)器做分庫分表等,接下來要說的緩存如果扛不住也可以機(jī)器。
使用緩存來提升性能
其實(shí)說到緩存,可能第一印象就是 Redis,但是緩存這個概念在計算機(jī)里到處都是,比如我們了解到的CPU 緩存、Web 緩存、磁盤緩存等等,這些地方都用到了緩存。緩存的種類和實(shí)踐是非常多的,但是我們可以發(fā)現(xiàn)這些緩存的點(diǎn),最終目的就是降低響應(yīng)時間。再回過來想我們學(xué)習(xí) Redis 的第一點(diǎn)就學(xué)到,Redis 是基于內(nèi)存的,它很快。
同步轉(zhuǎn)異步處理
又說到同步、異步這些詞,這些詞真的是太太太大眾化了。
那什么是同步,什么是異步呢?
以調(diào)用一個方法舉例,
同步調(diào)用代表調(diào)用方要阻塞等待被調(diào)用方法中的邏輯執(zhí)行完成。這種方式下,當(dāng)被調(diào)用方法響應(yīng)時間較長時,會造成調(diào)用方長久的阻塞,在高并發(fā)下會造成整體系統(tǒng)性能下降甚至發(fā)生雪崩。 異步調(diào)用則相反,調(diào)用方不必等待方法邏輯執(zhí)行完成就可返回執(zhí)行其他邏輯,在被調(diào)用方法執(zhí)行完畢后再通過回調(diào)、事件通知等方式將結(jié)果反饋給調(diào)用方。
做個比喻:以等外賣為例,你在門口一直等到外賣送過來,這個就是同步外賣。你先去干自己的事情,外賣到了給你打電話叫你取餐,你才來取餐,這個就是異步外賣。
比如前面圖片我說到的花唄還款,還款一直顯示的是還款處理中,其實(shí)這個提示就代表著系統(tǒng)在異步處理我們的還款請求了。因?yàn)橐粋€還款請求需要涉及到很多內(nèi)部服務(wù)之間的互相調(diào)用。
我們做同步轉(zhuǎn)異步的方式就是:采用消息隊列,還款處理時我們會把這個請求丟到消息隊列中,然后同時快速告訴我們:還款處理中,然后就釋放出資源去處理更多的還款請求。當(dāng)我們的還款請求在消息隊列最終被處理完畢之后,再告訴我們還款成功/失敗。
當(dāng)我們采用消息隊列同步轉(zhuǎn)異步,比如可以從以前的同步還款 10s 響應(yīng)時間,提高到 4s 響應(yīng)時間告訴他處理中。系統(tǒng)的資源占用也少了很多,可以去處理更多的花唄還款請求了,系統(tǒng)承受高并發(fā)的能力也就提升了。這里其實(shí)也是消息隊列的作用之一。

花唄異步處理還款操作示意圖
我們還需要做什么?異常處理
其實(shí)我們還需要思考很多點(diǎn),很多異常情況,寫好代碼做好設(shè)計很簡單,但是更難的是我們要如何做好異常處理進(jìn)行兜底,比如:
以上機(jī)器掛了怎么辦? 服務(wù)之間的各種調(diào)用問題等等
總結(jié)
說到這里,其實(shí)就算一個基本的結(jié)束了,高并發(fā)的設(shè)計其實(shí)就聊這些,以上內(nèi)容基本都是理論。但是 一個實(shí)踐案例不能完全涵蓋一個理論,相反一個理論可以支撐很多的實(shí)踐案例。
這些思路其實(shí)在最近的實(shí)踐中也進(jìn)行了運(yùn)用,這樣設(shè)計里面肯定還會出現(xiàn)很多問題的點(diǎn),這些問題的點(diǎn)這篇文章不做細(xì)講。我們目前已經(jīng)把修房子的房子架構(gòu)圖已經(jīng)修好了,至于房子里的裝修怎么弄,就是后面的事了。
但是如果當(dāng)你去面試或者做設(shè)計的時候,你就可以從這些點(diǎn)來出發(fā)回答問題和思考問題。這樣就不會過于細(xì)節(jié)或者回答偏離邏輯點(diǎn),從總體到細(xì)節(jié)。

原創(chuàng)電子書原創(chuàng)思維導(dǎo)圖
掃碼或微信搜 Java3y?回復(fù)「888」領(lǐng)取1000+頁原創(chuàng)電子書和思維導(dǎo)圖。
![]() |
|





