自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

聊聊接口最大并發(fā)處理數(shù)

開(kāi)發(fā) 前端
accept-count 相當(dāng)于設(shè)置飯店門(mén)口的排隊(duì)人數(shù)大小。想一想我們外出吃飯的時(shí)候,什么情況需要排隊(duì),當(dāng)然是店內(nèi)爆滿,沒(méi)有座位。那么這個(gè)時(shí)候你就需要排個(gè)隊(duì)了。注意如果說(shuō)排隊(duì)人都滿了,怎么辦?

今天跟大家聊聊一個(gè) Java 界的老話題,就是怎么理解接口的最大并發(fā)處理數(shù)。

前言

生活在 2023 年的互聯(lián)網(wǎng)時(shí)代下,又是在國(guó)內(nèi)互聯(lián)網(wǎng)越發(fā)內(nèi)卷的背景下,相信大家面試找工作、網(wǎng)上學(xué)習(xí)查資料時(shí)都了解過(guò)互聯(lián)網(wǎng)系統(tǒng)設(shè)計(jì)三高指標(biāo),那就是高并發(fā)、高性能、高可用。本文主要講高并發(fā)、高性能相關(guān)。本質(zhì)上高性能也是為了給高并發(fā)鋪平道路。而高并發(fā)設(shè)計(jì)中一部分就是對(duì)應(yīng)了本文主題接口最大并發(fā)數(shù)。本文思維導(dǎo)圖如下,

圖片圖片

并發(fā)和并行

再開(kāi)始講并發(fā)之前,我需要再給大家回顧一些舊知識(shí)。

什么是并發(fā)?什么是并行...

并發(fā)(Concurrency)

早期計(jì)算機(jī)的 CPU 都是單核的,一個(gè) CPU 在同一時(shí)間只能執(zhí)行一個(gè)進(jìn)程/線程,當(dāng)系統(tǒng)中有多個(gè)進(jìn)程/線程等待執(zhí)行時(shí),CPU 只能執(zhí)行完一個(gè)再執(zhí)行下一個(gè)。

計(jì)算機(jī)在運(yùn)行過(guò)程中,有很多指令會(huì)涉及 I/O 操作,而 I/O 操作又是相當(dāng)耗時(shí)的,速度遠(yuǎn)遠(yuǎn)低于 CPU,這導(dǎo)致 CPU 經(jīng)常處于空閑狀態(tài),只能等待 I/O 操作完成后才能繼續(xù)執(zhí)行后面的指令。

為了提高 CPU 利用率,減少等待時(shí)間,人們提出了一種 CPU 并發(fā)工作的理論。

所謂并發(fā),就是通過(guò)一種算法將 CPU 資源合理地分配給多個(gè)任務(wù),當(dāng)一個(gè)任務(wù)執(zhí)行 I/O 操作時(shí),CPU 可以轉(zhuǎn)而執(zhí)行其它的任務(wù),等到 I/O 操作完成以后,或者新的任務(wù)遇到 I/O 操作時(shí),CPU 再回到原來(lái)的任務(wù)繼續(xù)執(zhí)行。

下圖展示了兩個(gè)任務(wù)并發(fā)執(zhí)行的過(guò)程:

圖片圖片

圖片來(lái)源自C語(yǔ)言中文網(wǎng)-并發(fā)和并行的區(qū)別(圖解)

雖然 CPU 在同一時(shí)刻只能執(zhí)行一個(gè)任務(wù),但是通過(guò)將 CPU 的使用權(quán)在恰當(dāng)?shù)臅r(shí)機(jī)分配給不同的任務(wù),使得多個(gè)任務(wù)在視覺(jué)上看起來(lái)是一起執(zhí)行的。CPU 的執(zhí)行速度極快,多任務(wù)切換的時(shí)間也極短,用戶根本感受不到,所以并發(fā)執(zhí)行看起來(lái)才跟真的一樣。

并行(Parallelism)

并發(fā)是針對(duì)單核 CPU 提出的,而并行則是針對(duì)多核 CPU 提出的。和單核 CPU 不同,多核 CPU 真正實(shí)現(xiàn)了“同時(shí)執(zhí)行多個(gè)任務(wù)”。

多核 CPU 內(nèi)部集成了多個(gè)計(jì)算核心(Core),每個(gè)核心相當(dāng)于一個(gè)簡(jiǎn)單的 CPU,如果不計(jì)較細(xì)節(jié),你可以認(rèn)為給計(jì)算機(jī)安裝了多個(gè)獨(dú)立的 CPU。

多核 CPU 的每個(gè)核心都可以獨(dú)立地執(zhí)行一個(gè)任務(wù),而且多個(gè)核心之間不會(huì)相互干擾。在不同核心上執(zhí)行的多個(gè)任務(wù),是真正地同時(shí)運(yùn)行,這種狀態(tài)就叫做并行。

例如,同樣是執(zhí)行兩個(gè)任務(wù),雙核 CPU 的工作狀態(tài)如下圖所示:

圖片圖片

圖片來(lái)源自C語(yǔ)言中文網(wǎng)-并發(fā)和并行的區(qū)別(圖解)

雙核 CPU 執(zhí)行兩個(gè)任務(wù)時(shí),每個(gè)核心各自執(zhí)行一個(gè)任務(wù),和單核 CPU 在兩個(gè)任務(wù)之間不斷切換相比,它的執(zhí)行效率更高。

思考一下

那么這里我們講了關(guān)于并發(fā)、并行概念與我們的接口最大并發(fā)處理數(shù)之間有什么關(guān)系嘞?放心這都是鋪墊,為了讓你好消化后面的內(nèi)容。

這里我給大家總結(jié)下并發(fā)與并行的概念:

  • 并發(fā):在同一時(shí)間段內(nèi),多個(gè)任務(wù)都在執(zhí)行,但不一定是同時(shí)執(zhí)行。這意味著這些任務(wù)在輪流使用 CPU 的時(shí)間片,給人一種它們?cè)凇巴瑫r(shí)”運(yùn)行的錯(cuò)覺(jué)。并發(fā)的真正含義在于,盡管多個(gè)程序或進(jìn)程可能正在運(yùn)行,但每次只有一個(gè)進(jìn)程或線程實(shí)際上正在使用 CPU。
  • 并行:指在同一時(shí)刻,多個(gè)任務(wù)都在執(zhí)行。這通常需要多個(gè)處理器或多核的 CPU 來(lái)實(shí)現(xiàn),因?yàn)橹挥羞@樣,每個(gè)處理器或核心才能在同一時(shí)刻執(zhí)行一個(gè)任務(wù)。例如,當(dāng)音樂(lè)軟件和 IDEA 同時(shí)運(yùn)行時(shí),如果計(jì)算機(jī)有兩個(gè)以上的 CPU 核心,那么這兩個(gè)應(yīng)用程序就可以真正地并行運(yùn)行。

大家注意我上面加粗的字體,并發(fā)強(qiáng)調(diào)的是在同一段時(shí)間內(nèi),它是一個(gè)時(shí)間范圍的概念。打個(gè)比方,并發(fā)是一個(gè)人同時(shí)吃三個(gè)饅頭,吃完一個(gè)饅頭需要 1 分鐘,他就算胃口在大,也只能一個(gè)一個(gè)饅頭吃,吃完三個(gè)需要花 3 分鐘。

再看并行,并行強(qiáng)調(diào)的在同一時(shí)刻。打個(gè)比方,并行就是三個(gè)人同時(shí)吃三個(gè)饅頭。這三個(gè)人可以在同一時(shí)刻一人吃一個(gè)饅頭。吃完三個(gè)只需要花 1 分鐘。

那么看到這里,我在問(wèn)你個(gè)問(wèn)題,3 個(gè)人的在 3 分鐘內(nèi)最多能吃多少個(gè)饅頭?

相信大家都能告訴我。

理解接口的最大并發(fā)處理數(shù)

在 Java 語(yǔ)言里面,我們?cè)趺蠢斫獠l(fā)跟并行嘞?還是跟吃饅頭一樣,我給大家打個(gè)比方,相信大家就明白了。

比如說(shuō)我有一個(gè)接口,他的 RT (響應(yīng)時(shí)長(zhǎng))是 50 毫秒,只有一個(gè)線程處理客戶端請(qǐng)求,那這個(gè)線程在 1000 毫秒就能夠處理 20 個(gè)客戶端請(qǐng)求。

這里 20 就代表一個(gè)線程在 1 秒內(nèi)的最大并發(fā)數(shù)。

那假如有兩個(gè)線程處理客戶端請(qǐng)求,接口的最大并發(fā)數(shù)是不是變成了 40,三個(gè)線程處理客戶端請(qǐng)求,接口的最大并發(fā)數(shù)就變成了 60,以此類(lèi)推。

這里我們就可以得出一個(gè)公式,線程個(gè)數(shù) * 單線程最大并發(fā)數(shù) 就代表接口的最大并行處理數(shù)。

那么根據(jù)公式,我們得出一個(gè)結(jié)論,通過(guò)增大線程數(shù)或者減少接口響應(yīng)時(shí)間可以增大接口的最大并發(fā)處理數(shù)。

聊聊 Tomcat 容器的并發(fā)處理配置

在 Spring Boot 發(fā)布后,Tomcat 就成為了 Spring Boot 默認(rèn)的 web 容器。這里結(jié)合上文內(nèi)容,給大家講解下 Spring Boot 中涉及 Tomcat 服務(wù)器的一些關(guān)鍵參數(shù),以及在高并發(fā)情況下如何通過(guò)這些參數(shù)來(lái)控制請(qǐng)求量。Spring boot 配置文件如下,

SpringBoot 版本:3.1.5

server:
  port: 8080
  tomcat:
    threads:
      max: 200
      min-spare: 10
    accept-count: 100
    max-connections: 8192

server.port

該參數(shù)用于指定服務(wù)器監(jiān)聽(tīng)的端口號(hào)。通過(guò)配置不同的端口號(hào),可以實(shí)現(xiàn)多個(gè)服務(wù)在同一主機(jī)上并行運(yùn)行。

這里為了方便大家理解,我用開(kāi)飯店來(lái)給大家做比喻。通過(guò)指定服務(wù)器 ip + 啟動(dòng)端口,就相當(dāng)于告訴顧客我們的飯店位置,等待顧客上門(mén)吃飯。

server.tomcat.threads.max

該參數(shù)定義了 Tomcat 服務(wù)器的最大線程數(shù)。在高并發(fā)情況下,可以通過(guò)增加最大線程數(shù)來(lái)提高服務(wù)器最大并發(fā)處理數(shù)的能力,但需要注意服務(wù)器的硬件資源限制。

threads.max 相當(dāng)于設(shè)置飯店在最忙碌時(shí)候,需要的最大的服務(wù)員數(shù)量,假如說(shuō)一個(gè)服務(wù)員只能服務(wù) 1 個(gè)客人,那么 200 個(gè)服務(wù)員就可以同時(shí)服務(wù) 200 個(gè)客人,注意這是并行服務(wù)哦。

server.tomcat.threads.min-spare

此參數(shù)用于設(shè)置服務(wù)器在空閑狀態(tài)下保持的最小線程數(shù)。確保服務(wù)器在處理請(qǐng)求時(shí)有足夠的線程可用,以避免延遲。

threads.min-spare 相當(dāng)于設(shè)置飯店空閑時(shí)候需要的最少的服務(wù)員數(shù)量。

server.tomcat.max-connections

該參數(shù)指定服務(wù)器接受和處理的客戶端最大連接數(shù)。超過(guò)這個(gè)限制后,會(huì)放入 accept-count 隊(duì)列中

max-connections 相當(dāng)于設(shè)置飯店空間內(nèi)客人的最大容納數(shù)量,注意是容納,進(jìn)了飯店的客人不是一進(jìn)來(lái)就能享受服務(wù)的。往往還需要等待一段時(shí)間。這段時(shí)間就是當(dāng)服務(wù)員服務(wù)上一個(gè)客人完畢后,有空出來(lái)的服務(wù)員才能給進(jìn)店新客人服務(wù)。

server.tomcat.accept-count

此參數(shù)定義了當(dāng)所有可能的請(qǐng)求處理線程都在使用時(shí),傳入連接請(qǐng)求的最大隊(duì)列長(zhǎng)度。在高并發(fā)情況下,可以通過(guò)適當(dāng)調(diào)整此參數(shù)來(lái)控制連接請(qǐng)求的排隊(duì)長(zhǎng)度。

accept-count 相當(dāng)于設(shè)置飯店門(mén)口的排隊(duì)人數(shù)大小。想一想我們外出吃飯的時(shí)候,什么情況需要排隊(duì),當(dāng)然是店內(nèi)爆滿,沒(méi)有座位。那么這個(gè)時(shí)候你就需要排個(gè)隊(duì)了。注意如果說(shuō)排隊(duì)人都滿了,怎么辦?

這個(gè)時(shí)候飯店就會(huì)通知沒(méi)有排上隊(duì),還想要假如排隊(duì)的人,“你們不要排隊(duì)了,今天吃飯人滿了,大家去別處吃飯吧!”。

對(duì)應(yīng)上 Tomcat 就是遇到客戶端連接數(shù)量超過(guò)了 max-connections + accept-count 大小后的情況,此時(shí) Tomcat 會(huì)直接拒絕新的客戶端連接。

責(zé)任編輯:武曉燕 來(lái)源: waynblog
相關(guān)推薦

2009-11-25 11:41:56

IIS最大并發(fā)數(shù)

2020-06-15 08:13:42

Linux服務(wù)端并發(fā)數(shù)

2020-06-15 08:25:35

Linux 系統(tǒng) 數(shù)據(jù)

2023-07-03 09:59:00

并發(fā)編程并發(fā)容器

2021-03-28 09:45:05

冪等性接口數(shù)據(jù)

2019-07-30 11:17:18

系統(tǒng)數(shù)據(jù)安全

2009-11-25 11:32:39

最大用戶并發(fā)數(shù)系統(tǒng)最大用戶數(shù)

2021-01-31 23:54:23

數(shù)倉(cāng)模型

2016-11-25 00:38:45

隔離負(fù)載均衡系統(tǒng)

2021-01-14 10:00:57

Restful接口

2021-09-06 08:26:08

JavaScript數(shù)獨(dú) LeetCode

2016-11-28 08:40:17

系統(tǒng)降級(jí)服務(wù)

2024-08-26 13:23:26

2016-11-25 00:45:37

隊(duì)列數(shù)據(jù)

2016-11-28 09:00:10

瀏覽器瀏覽器緩存服務(wù)端

2024-03-12 13:11:20

powerjob單機(jī)線程

2021-09-06 11:58:24

Python腳本Jmeter

2022-06-12 06:45:26

高并發(fā)防重

2009-11-25 13:45:06

linux服務(wù)器并發(fā)處理數(shù)

2021-09-18 09:45:33

前端接口架構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)