0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

高并發(fā)系統(tǒng)的藝術(shù):如何在流量洪峰中游刃有余

京東云 ? 來源:jf_75140285 ? 作者:jf_75140285 ? 2024-08-05 13:43 ? 次閱讀

前言

我們常說的三高,高并發(fā)、高可用、高性能,這些技術(shù)是構(gòu)建現(xiàn)代互聯(lián)網(wǎng)應(yīng)用程序所必需的。對于京東618備戰(zhàn)來說,所有的中臺系統(tǒng)服務(wù),無疑都是圍繞著三高來展開的。而對于京東龐大的客戶群體,高并發(fā)的要求尤為重要。用戶對在線服務(wù)的需求和期望不斷提高,系統(tǒng)的并發(fā)處理能力成為衡量其性能和用戶體驗的關(guān)鍵指標(biāo)之一。高并發(fā)系統(tǒng)不僅僅是大型互聯(lián)網(wǎng)企業(yè)的專利,對于任何希望在市場中占據(jù)一席之地的公司來說,能夠處理大量并發(fā)請求的能力都是至關(guān)重要的。

高并發(fā)系統(tǒng)的設(shè)計和實現(xiàn)是一個復(fù)雜且多層次的過程,涉及到硬件資源的合理利用、系統(tǒng)架構(gòu)的精心設(shè)計、并發(fā)控制技術(shù)的應(yīng)用以及性能調(diào)優(yōu)等多個方面。無論是電商平臺在大促期間應(yīng)對突發(fā)流量,還是社交媒體在熱點事件發(fā)生時的流量激增,抑或是金融系統(tǒng)在交易高峰期的平穩(wěn)運(yùn)行,都需要一個高效、穩(wěn)定、可擴(kuò)展的高并發(fā)系統(tǒng)作為支撐。

接下來我通過一張思維導(dǎo)圖展開我的分享,幫大家梳理一下一個高并發(fā)系統(tǒng)所需要考慮的技術(shù)點。

wKgZomawZnKANlnmAAj89Sh41Aw003.png

單機(jī)維度

在單機(jī)維度上, 我們一般分為硬件維度和代碼維度兩個方向考慮。硬件維度比較簡單,就是提升單機(jī)的硬件性能和網(wǎng)絡(luò)帶寬。而代碼維度,則是在高并發(fā)系統(tǒng)架構(gòu)設(shè)計時,最容易被大家忽視的,尤其是大量的脫離一線研發(fā)并進(jìn)化成PPT架構(gòu)師的今天,單機(jī)維度基本不在考量范圍。

但不積跬步無以至千里,有的時候單機(jī)接口的的性能優(yōu)化,會帶來很高的經(jīng)濟(jì)成本價值。在代碼維度,我這里重點介紹一種情況,關(guān)于多線程和異步方法。

a. 多線程和異步方法的誤區(qū)

關(guān)于多線程和異步方法的概念,我再面試候選人的時候,發(fā)現(xiàn)很多人對此都有誤區(qū)。在此,我先詳細(xì)的一下他倆的概念:

多線程:多線程是指在一個進(jìn)程中可以同時運(yùn)行多個線程,每個線程執(zhí)行不同的任務(wù)。Java通過java.lang.Thread類和java.util.concurrent包提供了多線程編程的支持。多線程的主要目的是為了充分利用CPU資源,提高程序的執(zhí)行效率。

異步方法:異步方法是指在調(diào)用某個方法時,不需要等待該方法執(zhí)行完成即可繼續(xù)執(zhí)行后續(xù)代碼。Java通過CompletableFuture和異步回調(diào)機(jī)制提供了異步編程的支持。異步方法的主要目的是為了提高系統(tǒng)的響應(yīng)能力和資源利用率。

b. 多線程能夠解決高并發(fā)場景么

當(dāng)大家了解了多線程和異步方法的概念后,那么我們就可以認(rèn)真思考一下,多線程一定能提升系統(tǒng)的并發(fā)能力么?

我的結(jié)論是:多線程可以提升部分服務(wù)的并發(fā)能力,但并不能顯著提高性能。

首先我們先了解,Tomcat的Servlet機(jī)制是基于多線程實現(xiàn)的,而如果你在單次請求中在此開辟線程池進(jìn)行多線程處理,在一定的并發(fā)情況下,你可能只是改善了單次請求的TP99,但無法有效提升系統(tǒng)的并發(fā)能力。因為多線程的性能提升與CPU核心數(shù)密切相關(guān)。如果系統(tǒng)只有一個CPU核心,那么多個線程只能在該核心上輪流執(zhí)行,無法實現(xiàn)真正的并行處理。而我們的宿主機(jī)一般也就是8C或者16C,在面單機(jī)上千的QPS請求時,多線程只會增加CPU上下文切換的負(fù)擔(dān)。

舉個簡單并且常見的例子,批量下單接口。我們常見的做法就是在批量下單接口中開辟線程池,然后建個多個下單在線程池中并行處理。這樣做的結(jié)果是,在請求量低的情況下,效果還是可以的,單次請求的QPS也會很低,但如果單機(jī)面臨每秒上千次的下單請求,這種實現(xiàn)方式就會出現(xiàn)問題。最直觀的觀察,可以通過TP99的監(jiān)控曲線發(fā)現(xiàn),就是請求量跟TP99呈現(xiàn)嚴(yán)重的正相關(guān)性。

而真正有效的提升下單接口的并發(fā)能力,是通過異步方式實現(xiàn)。但異步方式又會增加系統(tǒng)的設(shè)計復(fù)雜度,比如下單失敗,異步回調(diào)設(shè)計和數(shù)據(jù)一致性設(shè)計等等,也在考量范圍之內(nèi),這里就不詳細(xì)展開說明。

c. 小結(jié)

多線程和異步方法是Java開發(fā)中兩種重要的并發(fā)處理技術(shù),它們在提高系統(tǒng)性能和響應(yīng)能力方面各有優(yōu)勢。多線程通過并行處理任務(wù),充分利用CPU資源,適用于CPU密集型任務(wù)和需要并行處理的場景。異步方法通過非阻塞I/O操作和異步回調(diào)機(jī)制,提高系統(tǒng)的響應(yīng)能力和資源利用率,適用于I/O密集型任務(wù)和事件驅(qū)動架構(gòu)。

此外當(dāng)然還有大家經(jīng)常樂于討論的JVM調(diào)優(yōu)問題,基于JVM調(diào)優(yōu),包括垃圾回收器的選擇,參數(shù)的合理優(yōu)化,當(dāng)然,還有一點,其實大家平時關(guān)注不多,就是采用更高版本的JDK和更新的Spring框架,因為高版本的框架會對性能本身有不錯的優(yōu)化。關(guān)于這點,我在另一篇文章中有重點介紹:性能加速包: SpringBoot 2.7&JDK 17,你敢嘗一嘗嗎

多機(jī)維度

在多機(jī)維度考慮系統(tǒng)的高并發(fā)性能,應(yīng)該是大家最長能夠想到的場景了,也是架構(gòu)師們最熱衷討論的點。

首先是對系統(tǒng)的拆分角度來說,第一個是單體應(yīng)用的水平擴(kuò)展問題,就是我們所說的負(fù)載均衡集群,換成我們經(jīng)常聽到的一個詞: 擴(kuò)容。擴(kuò)容一般針對負(fù)載均衡集群進(jìn)行水平擴(kuò)展,用于解決單機(jī)無法承載高并發(fā)的情況,這也是互聯(lián)網(wǎng)公司解決高并發(fā)場景的最常用手段,就比如每次雙十一或者618前夕,我們都會成倍的擴(kuò)容我們的服務(wù)實例。

對系統(tǒng)的另一個拆分角度,叫做垂直拆分,也就是我們常見的分布式系統(tǒng)。比如按照領(lǐng)域劃分,我們將一個大的單體服務(wù),拆分成不同的子領(lǐng)域系統(tǒng),然后每個子領(lǐng)域系統(tǒng)單獨承擔(dān)各自的流量,而不會相互影響。還比如說長江的CQRS設(shè)計架構(gòu),翻譯過來是指令查詢分離的設(shè)計方式,通過查詢和指令服務(wù)拆分,來講高并發(fā)的查詢場景單獨拆分出來進(jìn)行設(shè)計。

既然采用了分布式的微服務(wù)架構(gòu),那么分布式系統(tǒng)的一些常見痛點也是高并發(fā)要考慮的,比如熔斷,降級,限流,超時等設(shè)計,這些本身是為了增強(qiáng)分布式系統(tǒng)的魯棒性,從而間接的增強(qiáng)系統(tǒng)的高并發(fā)承載能力。關(guān)于微服務(wù)架構(gòu),在此處不再贅述,有興趣的,可以看我的另一篇文章:【實踐篇】教你玩轉(zhuǎn)微服務(wù)--基于DDD的微服務(wù)架構(gòu)落地實踐之路


垂直維度

所謂垂直維度,是為了區(qū)分于單機(jī)維度和多機(jī)維度的,垂直的意思是針對一個業(yè)務(wù)系統(tǒng)在系統(tǒng)層級的垂直劃分,包括業(yè)務(wù)應(yīng)用和數(shù)據(jù)庫。要知道,很多高并發(fā)場景,不管是寫場景還是讀場景,當(dāng)數(shù)據(jù)庫維度出現(xiàn)瓶頸,擴(kuò)容就不想業(yè)務(wù)應(yīng)用服務(wù)那么簡單了,所以要區(qū)分來說。

a. 業(yè)務(wù)應(yīng)用

唯物辯證法中有一個重要概念,就是一切從實際出發(fā),具體問題具體分析。對于高并發(fā)系統(tǒng)的構(gòu)建,雖然有通用的手段和方法論,但沒有統(tǒng)一的落地方案,必須根據(jù)具體的業(yè)務(wù)應(yīng)用場景進(jìn)行分析和設(shè)計。比如你的系統(tǒng)是高并發(fā)讀還是高并發(fā)寫,處理思路也是完全不一樣的。當(dāng)然常見的手段和方法論核心包括兩點:緩存和異步。但具體到相應(yīng)的業(yè)務(wù),需要仔細(xì)思考緩存邏輯怎么設(shè)計,異步流程怎么設(shè)計,如何保證數(shù)據(jù)一致性等等。

這塊我有一個項目案例,就是在SAAS商城中秒殺場景下,如何設(shè)計高性能庫存扣減邏輯,我將這塊內(nèi)容寫在了我另一篇文章里:高并發(fā)場景下的庫存管理,理論與實戰(zhàn)能否兼得?

b. 數(shù)據(jù)庫

在存儲媒介這塊其實高并發(fā)是不好設(shè)計的。比如關(guān)系型數(shù)據(jù)庫MySQL, 在進(jìn)行擴(kuò)展要比業(yè)務(wù)應(yīng)用復(fù)雜不少,涉及到的就是數(shù)據(jù)庫的分庫分表邏輯。

這塊可以參考之前我寫過的一篇文章:分而治之--淺談分庫分表及實踐之路。

而對于讀場景下的高并發(fā)請求,還有一種最常見的處理手段,就是異構(gòu)存儲介質(zhì),實現(xiàn)讀寫分離,最常見的就是MySQL關(guān)系型數(shù)據(jù)庫負(fù)責(zé)寫,ES這種文檔類數(shù)據(jù)庫負(fù)責(zé)讀。而他的技術(shù)難點則在于數(shù)據(jù)的同步和數(shù)據(jù)一致性上。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2946

    瀏覽量

    104361
  • 數(shù)據(jù)庫
    +關(guān)注

    關(guān)注

    7

    文章

    3733

    瀏覽量

    64168
收藏 人收藏

    評論

    相關(guān)推薦

    何在智能手機(jī)系統(tǒng)中使用bq27505

    電子發(fā)燒友網(wǎng)站提供《如何在智能手機(jī)系統(tǒng)中使用bq27505.pdf》資料免費下載
    發(fā)表于 10-17 10:21 ?0次下載
    如<b class='flag-5'>何在</b>智能手機(jī)<b class='flag-5'>系統(tǒng)</b>中使用bq27505

    測試聊并發(fā)-入門篇

    服務(wù)端接口的性能測試中,我們面臨的挑戰(zhàn)不僅僅是處理單個請求的效率,更在于如何在多用戶同時訪問時保持系統(tǒng)的穩(wěn)定性和響應(yīng)速度。并發(fā)編程和測試,作為性能測試的核心,對于評估系統(tǒng)
    的頭像 發(fā)表于 10-15 15:23 ?76次閱讀
    測試聊<b class='flag-5'>并發(fā)</b>-入門篇

    重塑定位邊界:革新 UWB 信標(biāo)定位系統(tǒng)測試套件,精準(zhǔn)并發(fā)融合引領(lǐng)未來

    面對日益復(fù)雜多變的應(yīng)用場景及并發(fā)需求的激增,巍泰技術(shù)特隆重推出采用 TurMass 無線通信技術(shù)的 UWB 信標(biāo)定位系統(tǒng)測試套件 WTS-102 ,為各類復(fù)雜應(yīng)用場景提供持續(xù)、可靠、精準(zhǔn)的定位服務(wù)。
    的頭像 發(fā)表于 09-23 15:13 ?484次閱讀
    重塑定位邊界:革新 UWB 信標(biāo)定位<b class='flag-5'>系統(tǒng)</b>測試套件,精準(zhǔn)<b class='flag-5'>并發(fā)</b>融合引領(lǐng)未來

    何在RS-485系統(tǒng)中隔離信號和電源

    電子發(fā)燒友網(wǎng)站提供《如何在RS-485系統(tǒng)中隔離信號和電源.pdf》資料免費下載
    發(fā)表于 08-27 09:48 ?3次下載
    如<b class='flag-5'>何在</b>RS-485<b class='flag-5'>系統(tǒng)</b>中隔離信號和電源

    大促并發(fā)系統(tǒng)性能優(yōu)化實戰(zhàn)--京東聯(lián)盟廣告推薦系統(tǒng)

    當(dāng)一個推薦系統(tǒng)面臨高頻、瞬時、大幅的流量突變時,如何在維持穩(wěn)定性的同時,最小化推薦效果損失? ? ? 背景 618對京東來說是一場重要的營銷盛會,大促將為業(yè)務(wù)各個層面帶來爆發(fā)式增長。然而,超大規(guī)模
    的頭像 發(fā)表于 08-14 10:41 ?215次閱讀
    大促<b class='flag-5'>高</b><b class='flag-5'>并發(fā)</b><b class='flag-5'>系統(tǒng)</b>性能優(yōu)化實戰(zhàn)--京東聯(lián)盟廣告推薦<b class='flag-5'>系統(tǒng)</b>

    并發(fā)物聯(lián)網(wǎng)云平臺是什么

    并發(fā)物聯(lián)網(wǎng)云平臺是一種能夠處理大量設(shè)備同時連接并進(jìn)行數(shù)據(jù)交換的云計算平臺。這種平臺通常被設(shè)計用來應(yīng)對來自數(shù)以萬計甚至數(shù)十億計的物聯(lián)網(wǎng)設(shè)備的并發(fā)請求,保證系統(tǒng)的穩(wěn)定性和響應(yīng)速度。 首先
    的頭像 發(fā)表于 08-13 13:50 ?179次閱讀

    邁威通信TSN工業(yè)自動化系統(tǒng)解決方案助力智能制造實現(xiàn)確定性服務(wù)

    在IT、服務(wù)器和云基礎(chǔ)設(shè)施的支撐下,邁威通信推出的工業(yè)自動化系統(tǒng)解決方案通過TSN技術(shù)實現(xiàn)精確的時間同步,確保關(guān)鍵控制數(shù)據(jù)的實時傳輸。無論是SCADA控制、網(wǎng)絡(luò)管理還是視頻和帶寬數(shù)據(jù)處理,我們都游刃有余!
    的頭像 發(fā)表于 05-23 17:20 ?403次閱讀
    邁威通信TSN工業(yè)自動化<b class='flag-5'>系統(tǒng)</b>解決方案助力智能制造實現(xiàn)確定性服務(wù)

    生態(tài)流量動態(tài)監(jiān)測系統(tǒng)解決方案及系統(tǒng)功能

    成都國科EP3000系列流量監(jiān)測管理系統(tǒng)以自動化流量和視頻監(jiān)控為主,以各類前端傳感器如水位計、閘位計、流量計、電能表和視頻等相互補(bǔ)充的形式進(jìn)行水位、
    的頭像 發(fā)表于 03-14 10:41 ?545次閱讀
    生態(tài)<b class='flag-5'>流量</b>動態(tài)監(jiān)測<b class='flag-5'>系統(tǒng)</b>解決方案及<b class='flag-5'>系統(tǒng)</b>功能

    HarmonyOS如何使用異步并發(fā)能力進(jìn)行開發(fā)

    一、并發(fā)概述 并發(fā)是指在同一時間段內(nèi),能夠處理多個任務(wù)的能力。為了提升應(yīng)用的響應(yīng)速度與幀率,以及防止耗時任務(wù)對主線程的干擾,HarmonyOS系統(tǒng)提供了異步并發(fā)和多線程
    的頭像 發(fā)表于 02-18 09:18 ?461次閱讀

    redis并發(fā)能力直接相關(guān)概念有哪些

    Redis是一種高性能的開源內(nèi)存數(shù)據(jù)庫,具有出色的并發(fā)能力。為了實現(xiàn)并發(fā),需要有一些相關(guān)概念和技術(shù)。下面是關(guān)于Redis并發(fā)能力的詳細(xì)解
    的頭像 發(fā)表于 12-05 10:34 ?703次閱讀

    java redis鎖處理并發(fā)代碼

    問題。 本文將詳細(xì)介紹如何在Java代碼中使用Redis實現(xiàn)并發(fā)代碼的鎖處理。我們將分為以下幾個方面來討論: Redis分布式鎖的原理 Redis分布式鎖的實現(xiàn)方式 在Java中使用Redis分布式鎖的代碼示例 Redis分布式鎖的注意事項 第一部分:Redis分布式鎖的
    的頭像 發(fā)表于 12-04 11:04 ?843次閱讀

    服務(wù)器并發(fā)的概念

    自己調(diào)整系統(tǒng)的相關(guān)參數(shù) 并發(fā)的概念是什么?什么是并發(fā)? 對于服務(wù)器并發(fā)的概念,下面幾點是錯誤的定義 ①服務(wù)器處理客戶端請求的數(shù)量:沒有時間、空間等限制,因此不能作為
    的頭像 發(fā)表于 11-10 10:05 ?4075次閱讀
    服務(wù)器<b class='flag-5'>并發(fā)</b>的概念

    并發(fā)內(nèi)存池項目實現(xiàn)

    本項目實現(xiàn)了一個并發(fā)內(nèi)存池,參考了Google的開源項目tcmalloc實現(xiàn)的簡易版;其功能就是實現(xiàn)高效的多線程內(nèi)存管理。由功能可知,并發(fā)指的是高效的多線程,而內(nèi)存池則是實現(xiàn)內(nèi)存管
    的頭像 發(fā)表于 11-09 11:16 ?624次閱讀
    <b class='flag-5'>高</b><b class='flag-5'>并發(fā)</b>內(nèi)存池項目實現(xiàn)

    基于ARM-Linux嵌入式系統(tǒng)的多進(jìn)程并發(fā)服務(wù)器設(shè)計

    電子發(fā)燒友網(wǎng)站提供《基于ARM-Linux嵌入式系統(tǒng)的多進(jìn)程并發(fā)服務(wù)器設(shè)計.pdf》資料免費下載
    發(fā)表于 11-08 15:31 ?0次下載
    基于ARM-Linux嵌入式<b class='flag-5'>系統(tǒng)</b>的多進(jìn)程<b class='flag-5'>并發(fā)</b>服務(wù)器設(shè)計

    FastTime-純Rust編寫的并發(fā)快速時間庫

    FastTime, 純Rust編寫的快速時間庫, 并發(fā): 2800萬+/秒. 一、組件
    的頭像 發(fā)表于 11-06 09:23 ?553次閱讀