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

面試官:請(qǐng)?jiān)O(shè)計(jì)一個(gè)能支撐百萬(wàn)連接的系統(tǒng)架構(gòu)!

開(kāi)發(fā) 架構(gòu)
這篇文章,給大家聊聊:如果你設(shè)計(jì)一個(gè)系統(tǒng)需要支撐百萬(wàn)用戶連接,應(yīng)該如何來(lái)設(shè)計(jì)其高并發(fā)請(qǐng)求處理架構(gòu)?

1、到底什么是連接?

假如說(shuō)現(xiàn)在你有一個(gè)系統(tǒng),他需要連接很多很多的硬件設(shè)備,這些硬件設(shè)備都要跟你的系統(tǒng)來(lái)通信。

那么,怎么跟你的系統(tǒng)通信呢?

首先,他一定會(huì)跟你的系統(tǒng)建立連接,然后會(huì)基于那個(gè)連接發(fā)送請(qǐng)求給你的系統(tǒng)。

接著你的系統(tǒng)會(huì)返回響應(yīng)給那個(gè)系統(tǒng),最后是大家一起把連接給斷開(kāi),釋放掉網(wǎng)絡(luò)資源。

所以我們來(lái)看一下下面的那個(gè)圖,感受一下這個(gè)所謂的連接到底是個(gè)什么概念。

2、為什么每次發(fā)送請(qǐng)求都要建立連接?

但是大家看著上面的那個(gè)圖,是不是感覺(jué)有一個(gè)很大的問(wèn)題。

什么問(wèn)題呢?那就是為啥每次發(fā)送請(qǐng)求,都必須要建立一個(gè)連接,然后再斷開(kāi)一個(gè)連接?

要知道,網(wǎng)絡(luò)連接的建立和連接涉及到多次網(wǎng)絡(luò)通信,本質(zhì)是一個(gè)比較耗費(fèi)資源的過(guò)程。

所以說(shuō)咱們完全沒(méi)必要每次發(fā)送請(qǐng)求都要建立一次連接,斷開(kāi)一次連接。

我們完全可以建立好一個(gè)連接,然后設(shè)備就不停的發(fā)送請(qǐng)求過(guò)來(lái),系統(tǒng)就通過(guò)那個(gè)連接返回響應(yīng)。

大家完全可以多次通過(guò)一個(gè)連接發(fā)送請(qǐng)求和返回響應(yīng),這就是所謂的長(zhǎng)連接。

也就是說(shuō),如果你一個(gè)連接建立之后,然后發(fā)送請(qǐng)求,接著就斷開(kāi),那這個(gè)連接維持的時(shí)間是很短的,這個(gè)就是所謂的短連接。

那如果一個(gè)設(shè)備跟你的系統(tǒng)建立好一個(gè)連接,然后接著就不停的通過(guò)這個(gè)連接發(fā)送請(qǐng)求接收響應(yīng),就可以避免不停的創(chuàng)建連接和斷開(kāi)連接的開(kāi)銷(xiāo)了。

大家看下面的圖,體驗(yàn)一下這個(gè)過(guò)程。在圖里面,兩次連接之間,有很多次發(fā)送請(qǐng)求和接收響應(yīng)的過(guò)程,這樣就可以利用一個(gè)連接但是進(jìn)行多次通信了。

3、長(zhǎng)連接模式下需要耗費(fèi)大量線程資源

但是現(xiàn)在問(wèn)題又來(lái)了,長(zhǎng)連接的模式確實(shí)是不錯(cuò)的,但是如果說(shuō)每個(gè)設(shè)備都要跟系統(tǒng)長(zhǎng)期維持一個(gè)連接,那么對(duì)于系統(tǒng)來(lái)說(shuō)就需要搞一個(gè)線程,這個(gè)線程需要去維護(hù)一個(gè)設(shè)備的長(zhǎng)連接,然后通過(guò)這個(gè)連接跟一個(gè)設(shè)備不停的通信,接收人家發(fā)送過(guò)來(lái)的請(qǐng)求,返回響應(yīng)給人家。

大家看下面的圖,每個(gè)設(shè)備都要跟系統(tǒng)維持一個(gè)連接,那么對(duì)于每個(gè)設(shè)備的連接,系統(tǒng)都會(huì)有一個(gè)獨(dú)立的線程來(lái)維護(hù)這個(gè)連接。

因?yàn)槟惚仨氁幸粋€(gè)線程不停的嘗試從網(wǎng)絡(luò)連接中讀取請(qǐng)求,接著要處理請(qǐng)求,最后還要返回響應(yīng)給設(shè)備。

那么這種模式有什么缺點(diǎn)呢?

缺點(diǎn)是很顯而易見(jiàn)的,假如說(shuō)此時(shí)你有上百萬(wàn)個(gè)設(shè)備要跟你的系統(tǒng)進(jìn)行連接,假設(shè)你的系統(tǒng)做了集群部署一共有100個(gè)服務(wù)實(shí)例,難道每個(gè)服務(wù)實(shí)例要維持1萬(wàn)個(gè)連接支撐跟1萬(wàn)個(gè)設(shè)備的通信?

如果這樣的話,每個(gè)服務(wù)實(shí)例不就是要維持1萬(wàn)個(gè)線程來(lái)維持1萬(wàn)個(gè)連接了嗎?大家覺(jué)得這個(gè)事兒靠譜嗎?

根據(jù)線上的生產(chǎn)經(jīng)驗(yàn),一般4核8G的標(biāo)準(zhǔn)服務(wù)用的虛擬機(jī),自己開(kāi)辟的工作線程在一兩百個(gè)就會(huì)讓CPU負(fù)載很高了,最佳的建議就是在幾十個(gè)工作線程就差不多。

所以要是期望每個(gè)服務(wù)實(shí)例來(lái)維持上萬(wàn)個(gè)線程,那幾乎是不可能的,所以這種模式最大的問(wèn)題就在于這里,沒(méi)法支撐大量連接。

4、Kafka遇到的問(wèn)題:應(yīng)對(duì)大量客戶端連接

實(shí)際上,對(duì)于大名鼎鼎的消息系統(tǒng)Kafka來(lái)說(shuō),他也是會(huì)面對(duì)同樣的問(wèn)題,因?yàn)樗枰獞?yīng)對(duì)大量的客戶端連接。

有很多生產(chǎn)者和消費(fèi)者都要跟Kafka建立類似上面的長(zhǎng)連接,然后基于一個(gè)連接,一直不停的通信。

舉個(gè)例子,比如生產(chǎn)者需要通過(guò)一個(gè)連接,不停的發(fā)送數(shù)據(jù)給Kafka。然后Kafka也要通過(guò)這個(gè)連接不停的返回響應(yīng)給生產(chǎn)者。

消費(fèi)者也需要通過(guò)一個(gè)連接不停的從Kafka獲取數(shù)據(jù),Kafka需要通過(guò)這個(gè)連接不停的返回?cái)?shù)據(jù)給消費(fèi)者。

大家看下面的圖,感受一下Kafka的生產(chǎn)現(xiàn)場(chǎng)。

那假如Kafka就簡(jiǎn)單的按照這個(gè)架構(gòu)來(lái)處理,如果你的公司里有幾萬(wàn)幾十萬(wàn)個(gè)的生產(chǎn)者或者消費(fèi)者的服務(wù)實(shí)例,難道Kafka集群就要為了幾萬(wàn)幾十萬(wàn)個(gè)連接來(lái)維護(hù)這么多的線程嗎?

同樣,這是不現(xiàn)實(shí)的,因?yàn)榫€程是昂貴的資源,不可能在集群里使用那么多的線程。


5、Kafka的架構(gòu)實(shí)踐:Reactor多路復(fù)用

針對(duì)這個(gè)問(wèn)題,大名鼎鼎的Kafka采用的架構(gòu)策略是Reactor多路復(fù)用模型。

簡(jiǎn)單來(lái)說(shuō),就是搞一個(gè)acceptor線程,基于底層操作系統(tǒng)的支持,實(shí)現(xiàn)連接請(qǐng)求監(jiān)聽(tīng)。

如果有某個(gè)設(shè)備發(fā)送了建立連接的請(qǐng)求過(guò)來(lái),那么那個(gè)線程就把這個(gè)建立好的連接交給processor線程。

每個(gè)processor線程會(huì)被分配N(xiāo)多個(gè)連接,一個(gè)線程就可以負(fù)責(zé)維持N多個(gè)連接,他同樣會(huì)基于底層操作系統(tǒng)的支持監(jiān)聽(tīng)N多連接的請(qǐng)求。

如果某個(gè)連接發(fā)送了請(qǐng)求過(guò)來(lái),那么這個(gè)processor線程就會(huì)把請(qǐng)求放到一個(gè)請(qǐng)求隊(duì)列里去。

接著后臺(tái)有一個(gè)線程池,這個(gè)線程池里有工作線程,會(huì)從請(qǐng)求隊(duì)列里獲取請(qǐng)求,處理請(qǐng)求,接著將請(qǐng)求對(duì)應(yīng)的響應(yīng)放到每個(gè)processor線程對(duì)應(yīng)的一個(gè)響應(yīng)隊(duì)列里去。

最后,processor線程會(huì)把自己的響應(yīng)隊(duì)列里的響應(yīng)發(fā)送回給客戶端。

說(shuō)了這么多,還是來(lái)一張圖,大家看下面的圖,就可以理解上述整個(gè)過(guò)程了。

6、優(yōu)化后的架構(gòu)是如何支撐大量連接的?

那么上面優(yōu)化后的那套架構(gòu),是如何支撐大量連接的呢?

其實(shí)很簡(jiǎn)單。這里最關(guān)鍵的一個(gè)因素,就是processor線程是一個(gè)人維持N個(gè)線程,基于底層操作系統(tǒng)的特殊機(jī)制的支持,一個(gè)人可以監(jiān)聽(tīng)N個(gè)連接的請(qǐng)求。

這是極為關(guān)鍵的一個(gè)步驟,就僅此一個(gè)步驟就可以讓一個(gè)線程支持多個(gè)連接了,不需要一個(gè)連接一個(gè)線程來(lái)支持。

而且那個(gè)processor線程僅僅是接收請(qǐng)求和發(fā)送響應(yīng),所有的請(qǐng)求都會(huì)入隊(duì)列排隊(duì),交給后臺(tái)線程池來(lái)處理。

比如說(shuō)按照100萬(wàn)連接來(lái)計(jì)算,如果有100臺(tái)機(jī)器來(lái)處理,按照老的模式,每臺(tái)機(jī)器需要維持1萬(wàn)個(gè)線程來(lái)處理1萬(wàn)個(gè)連接。

但是如果按照這種多路復(fù)用的模式,可能就比如10個(gè)processor + 40個(gè)線程的線程池,一共50個(gè)線程就可以上萬(wàn)連接。

在這種模式下,每臺(tái)機(jī)器有限的線程數(shù)量可以抗住大量的連接。

因此實(shí)際上我們?cè)谠O(shè)計(jì)這種支撐大量連接的系統(tǒng)的時(shí)候,完全可以參考這種架構(gòu),設(shè)計(jì)成多路復(fù)用的模式,用幾十個(gè)線程處理成千上萬(wàn)個(gè)連接,最終實(shí)現(xiàn)百萬(wàn)連接的處理架構(gòu)。

責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2022-01-10 11:04:41

單鏈表面試編程

2023-07-31 08:26:09

2021-05-19 08:17:35

秒殺場(chǎng)景高并發(fā)

2024-05-28 10:14:31

JavaScrip模板引擎

2025-04-29 02:00:00

高并發(fā)系統(tǒng)場(chǎng)景

2024-08-07 08:15:47

2022-04-08 08:26:03

JavaHTTP請(qǐng)求

2021-09-28 13:42:55

Chrome Devwebsocket網(wǎng)絡(luò)協(xié)議

2024-04-09 08:39:16

本地緩存開(kāi)發(fā)線程安全

2024-10-07 08:52:59

分布式系統(tǒng)分布式 IDID

2019-04-29 14:59:41

Tomcat系統(tǒng)架構(gòu)

2017-03-16 15:27:10

面試官測(cè)試技術(shù)

2022-10-14 08:29:18

DNS系統(tǒng)地址

2024-12-26 10:19:16

2020-05-13 14:35:47

HashMap面試官Java

2020-06-22 07:47:46

提交面試官訂單

2022-08-18 20:02:04

JSLRU緩存

2019-02-27 09:46:05

數(shù)據(jù)庫(kù)架構(gòu)并發(fā)

2021-06-09 07:55:19

NodeEventEmitte驅(qū)動(dòng)

2022-01-14 13:53:03

TCP進(jìn)程窗口
點(diǎn)贊
收藏

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