<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          高并發(fā),你真的理解透徹了嗎?

          共 5758字,需瀏覽 12分鐘

           ·

          2021-06-01 02:47

          高并發(fā),幾乎是每個程序員都想擁有的經(jīng)驗。原因很簡單:隨著流量變大,會遇到各種各樣的技術(shù)問題,比如接口響應(yīng)超時、CPU load 升高、GC 頻繁、死鎖、大數(shù)據(jù)量存儲等等,這些問題能推動我們在技術(shù)深度上不斷精進。

          在過往的面試中,如果候選人做過高并發(fā)的項目,我通常會讓對方談?wù)剬τ诟卟l(fā)的理解,但是能系統(tǒng)性地回答好此問題的人并不多,大概分成這樣幾類:

          1、對數(shù)據(jù)化的指標沒有概念:不清楚選擇什么樣的指標來衡量高并發(fā)系統(tǒng)?分不清并發(fā)量和 QPS,甚至不知道自己系統(tǒng)的總用戶量、活躍用戶量,平峰和高峰時的 QPS和 TPS 等關(guān)鍵數(shù)據(jù)。

          2、設(shè)計了一些方案,但是細節(jié)掌握不透徹:講不出該方案要關(guān)注的技術(shù)點和可能帶來的副作用。比如讀性能有瓶頸會引入緩存,但是忽視了緩存命中率、熱點 key、數(shù)據(jù)一致性等問題。

          3、理解片面,把高并發(fā)設(shè)計等同于性能優(yōu)化:大談并發(fā)編程、多級緩存、異步化、水平擴容,卻忽視高可用設(shè)計、服務(wù)治理和運維保障。

          4、掌握大方案,卻忽視最基本的東西:能講清楚垂直分層、水平分區(qū)、緩存等大思路,卻沒意識去分析數(shù)據(jù)結(jié)構(gòu)是否合理,算法是否高效,沒想過從最根本的 IO 和計算兩個維度去做細節(jié)優(yōu)化。

          這篇文章,我想結(jié)合自己的高并發(fā)項目經(jīng)驗,系統(tǒng)性地總結(jié)下高并發(fā)需要掌握的知識和實踐思路,希望對你有所幫助。內(nèi)容分成以下 3 個部分:

          • 如何理解高并發(fā)?
          • 高并發(fā)系統(tǒng)設(shè)計的目標是什么?
          • 高并發(fā)的實踐方案有哪些?

          01 如何理解高并發(fā)?

          高并發(fā)意味著大流量,需要運用技術(shù)手段抵抗流量的沖擊,這些手段好比操作流量,能讓流量更平穩(wěn)地被系統(tǒng)所處理,帶給用戶更好的體驗。

          我們常見的高并發(fā)場景有:淘寶的雙 11、春運時的搶票、微博大V 的熱點新聞等。除了這些典型事情,每秒幾十萬請求的秒殺系統(tǒng)、每天千萬級的訂單系統(tǒng)、每天億級日活的信息流系統(tǒng)等,都可以歸為高并發(fā)。

          很顯然,上面談到的高并發(fā)場景,并發(fā)量各不相同,那到底多大并發(fā)才算高并發(fā)呢?

          1、不能只看數(shù)字,要看具體的業(yè)務(wù)場景。不能說 10W QPS 的秒殺是高并發(fā),而 1W QPS 的信息流就不是高并發(fā)。信息流場景涉及復雜的推薦模型和各種人工策略,它的業(yè)務(wù)邏輯可能比秒殺場景復雜 10 倍不止。因此,不在同一個維度,沒有任何比較意義。

          2、業(yè)務(wù)都是從 0 到 1 做起來的,并發(fā)量和 QPS 只是參考指標,最重要的是:在業(yè)務(wù)量逐漸變成原來的 10 倍、100 倍的過程中,你是否用到了高并發(fā)的處理方法去演進你的系統(tǒng),從架構(gòu)設(shè)計、編碼實現(xiàn)、甚至產(chǎn)品方案等維度去預防和解決高并發(fā)引起的問題?而不是一味的升級硬件、加機器做水平擴展。

          此外,各個高并發(fā)場景的業(yè)務(wù)特點完全不同:有讀多寫少的信息流場景、有讀多寫多的交易場景,那是否有通用的技術(shù)方案解決不同場景的高并發(fā)問題呢

          我覺得大的思路可以借鑒,別人的方案也可以參考,但是真正落地過程中,細節(jié)上還會有無數(shù)的坑。另外,由于軟硬件環(huán)境、技術(shù)棧、以及產(chǎn)品邏輯都沒法做到完全一致,這些都會導致同樣的業(yè)務(wù)場景,就算用相同的技術(shù)方案也會面臨不同的問題,這些坑還得一個個趟。

          因此,這篇文章我會將重點放在基礎(chǔ)知識、通用思路、和我曾經(jīng)實踐過的有效經(jīng)驗上,希望讓你對高并發(fā)有更深的理解。


          02 高并發(fā)系統(tǒng)設(shè)計的目標是什么?

          先搞清楚高并發(fā)系統(tǒng)設(shè)計的目標,在此基礎(chǔ)上再討論設(shè)計方案和實踐經(jīng)驗才有意義和針對性。

          2.1 宏觀目標

          高并發(fā)絕不意味著只追求高性能,這是很多人片面的理解。從宏觀角度看,高并發(fā)系統(tǒng)設(shè)計的目標有三個:高性能、高可用,以及高可擴展。

          1、高性能:性能體現(xiàn)了系統(tǒng)的并行處理能力,在有限的硬件投入下,提高性能意味著節(jié)省成本。同時,性能也反映了用戶體驗,響應(yīng)時間分別是 100 毫秒和 1 秒,給用戶的感受是完全不同的。

          2、高可用表示系統(tǒng)可以正常服務(wù)的時間。一個全年不停機、無故障;另一個隔三差五出線上事故、宕機,用戶肯定選擇前者。另外,如果系統(tǒng)只能做到 90% 可用,也會大大拖累業(yè)務(wù)。

          3、高擴展:表示系統(tǒng)的擴展能力,流量高峰時能否在短時間內(nèi)完成擴容,更平穩(wěn)地承接峰值流量,比如雙 11 活動、明星離婚等熱點事件。

          這 3 個目標是需要通盤考慮的,因為它們互相關(guān)聯(lián)、甚至也會相互影響。

          如說考慮系統(tǒng)的擴展能力,你會將服務(wù)設(shè)計成無狀態(tài)的這種集群設(shè)保證了高擴展性,其實也間接提升了系統(tǒng)的性能和可用性

          再比如說:為了保證可用性,通常會對服務(wù)接口進行超時設(shè)置,以防大量線程阻塞在慢請求上造成系統(tǒng)雪崩,那超時時間設(shè)置成多少合理呢?一般,我們會參考依賴服務(wù)的性能表現(xiàn)進行設(shè)置。

          2.2 微觀目標

          再從微觀角度來看,高性能、高可用和高擴展又有哪些具體的指標來衡量?為什么會選擇這些指標呢?

          性能指標

          通過性能指標可以度量目前存在的性能問題,同時作為性能優(yōu)化的評估依據(jù)。一般來說,會采用一段時間內(nèi)的接口響應(yīng)時間作為指標。

          1、平均響應(yīng)時間:最常用,但是缺陷很明顯,對于慢請求不敏感。比如 1 萬次請求,其中 9900 次是 1ms,100 次是 100ms,則平均響應(yīng)時間為 1.99ms,雖然平均耗時僅增加了 0.99ms,但是 1% 請求的響應(yīng)時間已經(jīng)增加了 100 倍。

          2、TP90、TP99 等分位值:將響應(yīng)時間按照從小到大排序,TP90 表示排在第 90 分位的響應(yīng)時間, 分位值越大,對慢請求越敏感。

          3、吞吐量:和響應(yīng)時間呈反比,比如響應(yīng)時間是 1ms,則吞吐量為每秒 1000 次。

          通常,設(shè)定性能目標時會兼顧吞吐量和響應(yīng)時間,比如這樣表述:在每秒 1 萬次請求下,AVG 控制在 50ms 以下,TP99 控制在 100ms 以下。對于高并發(fā)系統(tǒng),AVG 和 TP 分位值必須同時要考慮。

          另外,從用戶體驗角度來看,200 毫秒被認為是第一個分界點,用戶感覺不到延遲,1 秒是第二個分界點,用戶能感受到延遲,但是可以接受。

          因此,對于一個健康的高并發(fā)系統(tǒng),TP99 應(yīng)該控制在 200 毫秒以內(nèi),TP999 或者 TP9999 應(yīng)該控制在 1 秒以內(nèi)。

          ? 可用性指標

          高可用性是指系統(tǒng)具有較高的無故障運行能力,可用性 = 正常運行時間 / 系統(tǒng)總運行時間,一般使用幾個9來描述系統(tǒng)的可用性。

          對于高并發(fā)系統(tǒng)來說,最基本的要求是:保證 3 個 9 或者 4 個 9。原因很簡單,如果你只能做到 2 個 9,意味著有 1% 的故障時間,像一些大公司每年動輒千億以上的 GMV 或者收入,1% 就是 10 億級別的業(yè)務(wù)影響。

          ? 可擴展性指標

          面對突發(fā)流量,不可能臨時改造架構(gòu),最快的方式就是增加機器來線性提高系統(tǒng)的處理能力。

          對于業(yè)務(wù)集群或者基礎(chǔ)組件來說,擴展性 = 性能提升比例 / 機器增加比例,理想的擴展能力是:資源增加幾倍,性能提升幾倍。通常來說,擴展能力要維持在 70% 以上。

          但是從高并發(fā)系統(tǒng)的整體架構(gòu)角度來看,擴展的目標不僅僅是把服務(wù)設(shè)計成無狀態(tài)就行了,因為當流量增加 10 倍,業(yè)務(wù)服務(wù)可以快速擴容 10 倍,但是數(shù)據(jù)庫可能就成為了新的瓶頸。

          像 MySQL 這種有狀態(tài)的存儲服務(wù)通常是擴展的技術(shù)難點,如果架構(gòu)上沒提前做好規(guī)劃(垂直和水平拆分),就會涉及到大量數(shù)據(jù)的遷移。

          因此,高擴展性需要考慮:服務(wù)集群、數(shù)據(jù)庫、緩存和消息隊列等中間件、負載均衡、帶寬、依賴的第三方等,當并發(fā)達到某一個量級后,上述每個因素都可能成為擴展的瓶頸點。


          03 高并發(fā)的實踐方案有哪些
          了解了高并發(fā)設(shè)計的 3 大目標后,再系統(tǒng)性總結(jié)下高并發(fā)的設(shè)計方案,會從以下兩部分展開:先總結(jié)下通用的設(shè)計方法,然后再圍繞高性能、高可用、高擴展分別給出具體的實踐方案。
          3.1 通用的設(shè)計方法
          通用的設(shè)計方法主要是從縱向橫向兩個維度出發(fā),俗稱高并發(fā)處理的兩板斧:縱向擴展和橫向擴展。

          ? 縱向擴展(scale-up)

          它的目標是提升單機的處理能力,方案又包括:

          1、提升單機的硬件性能:通過增加內(nèi)存、CPU 核數(shù)、存儲容量、或者將磁盤升級成 SSD 等堆硬提升
          2、提升單機的軟件性能:使用緩存減少 IO 次數(shù),使用并發(fā)或者異步的方式增加吞吐量。

          ? 橫向擴展(scale-out)

          因為單機性能總會存在極限,所以最終還需要引入橫向擴展,通過集群部署以進一步提高并發(fā)處理能力,又包括以下 2 個方向:

          1、做好分層架構(gòu):這是橫向擴展的提前,因為高并發(fā)系統(tǒng)往往業(yè)務(wù)復雜,通過分層處理可以簡化復雜問題,更容易做到橫向擴展。

          上面這種圖是互聯(lián)網(wǎng)最常見的分層架構(gòu),當然真實的高并發(fā)系統(tǒng)架構(gòu)會在此基礎(chǔ)上進一步完善。比如會做動靜分離并引入 CDN,反向代理層可以是 LVS+Nginx,Web 層可以是統(tǒng)一的 API 網(wǎng)關(guān),業(yè)務(wù)服務(wù)層可進一步按垂直業(yè)務(wù)做微服務(wù)化,存儲層可以是各種異構(gòu)數(shù)據(jù)庫。

          2、各層進行水平擴展:無狀態(tài)水平擴容,有狀態(tài)做分片路由。業(yè)務(wù)集群通常能設(shè)計成無狀態(tài)的,而數(shù)據(jù)庫和緩存往往是有狀態(tài)的,因此需要設(shè)計分區(qū)鍵做好存儲分片,當然也可以通過主從同步、讀寫分離的方案提升讀性能。

          3.2 具體的實踐方案
          下面再結(jié)合我的個人經(jīng)驗,針對高性能、高可用、高擴展 3 個方面,總結(jié)下可落地的實踐方案。

          ? 高性能的實踐方案

          1、集群部署,通過負載均衡減輕單機壓力。

          2、多級緩存,包括靜態(tài)數(shù)據(jù)使用 CDN、本地緩存、分布式緩存等,以及對緩存場景中的熱點 key、緩存穿透、緩存并發(fā)、數(shù)據(jù)一致性等問題的處理。
          3、分庫分表和索引優(yōu)化,以及借助搜索引擎解決復雜查詢問題。
          4、考慮 NoSQL 數(shù)據(jù)庫的使用,比如 HBase、TiDB 等,但是團隊必須熟悉這些組件,且有較強的運維能力。
          5、異步化,將次要流程通過多線程、MQ、甚至延時任務(wù)進行異步處理。
          6、限流,需要先考慮業(yè)務(wù)是否允許限流(比如秒殺場景是允許的),包括前端限流、Nginx 接入層的限流、服務(wù)端的限流。
          7、對流量進行削峰填谷,通過 MQ 承接流量。
          8、并發(fā)處理,通過多線程將串行邏輯并行化。
          9、預計算,比如搶紅包場景,可以提前計算好紅包金額緩存起來,發(fā)紅包時直接使用即可
          10、緩存預熱,通過異步任務(wù)提前預熱數(shù)據(jù)到本地緩存或者分布式緩存中。
          11、減少 IO 次數(shù),比如數(shù)據(jù)庫和緩存的批量讀寫、RPC 的批量接口支持、或者通過冗余數(shù)據(jù)的方式干掉 RPC 調(diào)用。
          12、減少 IO 時的數(shù)據(jù)包大小,包括采用輕量級的通信協(xié)議、合適的數(shù)據(jù)結(jié)構(gòu)、去掉接口中的多余字段、減少緩存 key 的大小、壓縮緩存 value 等。
          13、程序邏輯優(yōu)化,比如將大概率阻斷執(zhí)行流程的判斷邏輯前置、For 循環(huán)的計算邏輯優(yōu)化,或者采用更高效的算法。
          14、各種池化技術(shù)的使用和池大小的設(shè)置,包括HTTP請求池、線程池(考慮 CPU 密集型還是 IO 密集型設(shè)置核心參數(shù))、數(shù)據(jù)庫和 Redis 連接池等。
          15、JVM 優(yōu)化,包括新生代和老年代的大小、GC 算法的選擇等,盡可能減少 GC 頻率和耗時。
          16、鎖選擇,讀多寫少的場景用樂觀鎖,或者考慮通過分段鎖的方式減少鎖沖突。

          上述方案無外乎從計算和 IO 兩個維度考慮所有可能的優(yōu)化點,需要有配套的監(jiān)控系統(tǒng)實時了解當前的性能表現(xiàn),并支撐你進行性能瓶頸分析,然后再遵循二八原則,抓主要矛盾進行優(yōu)化。

          ? 高可用的實踐方案

          1、對等節(jié)點的故障轉(zhuǎn)移,Nginx 和服務(wù)治理框架均支持一個節(jié)點失敗后訪問另一個節(jié)點。

          2、非對等節(jié)點的故障轉(zhuǎn)移,通過心跳檢測并實施主備切換(比如 Redis 的哨兵模式或者集群模式、MySQL 的主從切換等)。
          3、接口層面的超時設(shè)置、重試策略和冪等設(shè)計
          4、降級處理:保證核心服務(wù),犧牲非核心服務(wù),必要時進行熔斷;或者核心鏈路出問題時,有備選鏈路。
          5、限流處理:對超過系統(tǒng)處理能力的請求直接拒絕或者返回錯誤碼。
          6、MQ 場景的消息可靠性保證,包括 producer 端的重試機制、broker 側(cè)的持久化、consumer 端的 ack 機制等。
          7、灰度發(fā)布,能支持按機器維度進行小流量部署,觀察系統(tǒng)日志和業(yè)務(wù)指標,等運行平穩(wěn)后再推全量。
          8、監(jiān)控報警:全方位的監(jiān)控體系,包括最基礎(chǔ)的 CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)的監(jiān)控,以及 Web 服務(wù)器、JVM、數(shù)據(jù)庫、各類中間件的監(jiān)控和業(yè)務(wù)指標的監(jiān)控。
          9、災(zāi)備演練:類似當前的“混沌工程”,對系統(tǒng)進行一些破壞性手段,觀察局部故障是否會引起可用性問題。

          高可用的方案主要從冗余、取舍、系統(tǒng)運維3個方向考慮,同時需要有配套的值班機制和故障處理流程,當出現(xiàn)線上問題時,可及時跟進處理。

          ? 高擴展的實踐方案

          1、合理的分層架構(gòu):比如上面談到的互聯(lián)網(wǎng)最常見的分層架構(gòu),另外還能進一步按照數(shù)據(jù)訪問層、業(yè)務(wù)邏輯層對微服務(wù)做更細粒度的分層(但是需要評估性能,會存在網(wǎng)絡(luò)多一跳的情況)。

          2、存儲層的拆分:按照業(yè)務(wù)維度做垂直拆分、按照數(shù)據(jù)特征維度進一步做水平拆分(分庫分表)。
          3、業(yè)務(wù)層的拆分:最常見的是按照業(yè)務(wù)維度拆(比如電商場景的商品服務(wù)、訂單服務(wù)等),也可以按照核心接口和非核心接口拆,還可以按照請求源拆(比如 To C 和 To B,APP 和 H5)。


          最后的話

          高并發(fā)確實是一個復雜且系統(tǒng)性的問題,由于篇幅有限,諸如分布式 Trace、全鏈路壓測、柔性事務(wù)都是要考慮的技術(shù)點。另外,如果業(yè)務(wù)場景不同,高并發(fā)的落地方案也會存在差異,但是總體的設(shè)計思路和可借鑒的方案基本類似。

          高并發(fā)設(shè)計同樣要秉承架構(gòu)設(shè)計的 3 個原則:簡單、合適和演進。“過早的優(yōu)化是萬惡之源”,不能脫離業(yè)務(wù)的實際情況,更不要過度設(shè)計,合適的方案就是最完美的。

          希望這篇文章能帶給你關(guān)于高并發(fā)更全面的認識,如果你也有可借鑒的經(jīng)驗和深入的思考,歡迎評論區(qū)留言討論。

          <END>


          往期精彩:

          瀏覽 73
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费看大学生裸体AV | 亚洲色无码专区观看在线观 | 国产精品人人妻人人爽人人牛 | 高清无码黄色视频 | AAAAAAAAAA黄片 |