偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

面試官:請設(shè)計一個能支撐百萬連接的系統(tǒng)架構(gòu)!

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

1、到底什么是連接?

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

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

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

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

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

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

但是大家看著上面的那個圖,是不是感覺有一個很大的問題。

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

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

所以說咱們完全沒必要每次發(fā)送請求都要建立一次連接,斷開一次連接。

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

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

也就是說,如果你一個連接建立之后,然后發(fā)送請求,接著就斷開,那這個連接維持的時間是很短的,這個就是所謂的短連接。

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

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

3、長連接模式下需要耗費大量線程資源

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

大家看下面的圖,每個設(shè)備都要跟系統(tǒng)維持一個連接,那么對于每個設(shè)備的連接,系統(tǒng)都會有一個獨立的線程來維護這個連接。

因為你必須要有一個線程不停的嘗試從網(wǎng)絡(luò)連接中讀取請求,接著要處理請求,最后還要返回響應(yīng)給設(shè)備。

那么這種模式有什么缺點呢?

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

如果這樣的話,每個服務(wù)實例不就是要維持1萬個線程來維持1萬個連接了嗎?大家覺得這個事兒靠譜嗎?

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

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

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

實際上,對于大名鼎鼎的消息系統(tǒng)Kafka來說,他也是會面對同樣的問題,因為他需要應(yīng)對大量的客戶端連接。

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

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

消費者也需要通過一個連接不停的從Kafka獲取數(shù)據(jù),Kafka需要通過這個連接不停的返回數(shù)據(jù)給消費者。

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

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

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


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

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

簡單來說,就是搞一個acceptor線程,基于底層操作系統(tǒng)的支持,實現(xiàn)連接請求監(jiān)聽。

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

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

如果某個連接發(fā)送了請求過來,那么這個processor線程就會把請求放到一個請求隊列里去。

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

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

說了這么多,還是來一張圖,大家看下面的圖,就可以理解上述整個過程了。

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

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

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

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

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

比如說按照100萬連接來計算,如果有100臺機器來處理,按照老的模式,每臺機器需要維持1萬個線程來處理1萬個連接。

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

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

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

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

2022-01-10 11:04:41

單鏈表面試編程

2025-06-04 03:15:00

高并發(fā)短鏈系統(tǒng)

2023-07-31 08:26:09

2021-05-19 08:17:35

秒殺場景高并發(fā)

2024-05-28 10:14:31

JavaScrip模板引擎

2025-04-29 02:00:00

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

2024-08-07 08:15:47

2022-04-08 08:26:03

JavaHTTP請求

2021-09-28 13:42:55

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

2024-04-09 08:39:16

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

2022-10-14 08:29:18

DNS系統(tǒng)地址

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

面試官測試技術(shù)

2024-12-26 10:19:16

2020-05-13 14:35:47

HashMap面試官Java

2019-02-27 09:46:05

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

2022-08-18 20:02:04

JSLRU緩存

2020-06-22 07:47:46

提交面試官訂單

2021-06-09 07:55:19

NodeEventEmitte驅(qū)動
點贊
收藏

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