久久国产精品一区二区三区四区,久色婷婷小香蕉久久,国产日韩欧美在线播放不卡,另类av一区二区

一篇學會 Go 網絡庫 Gnet 解析
來源:RememberGo    時間:2022-06-09 09:01:40
開篇

我們分析了Go原生網絡模型以及部分源碼,絕大部分場景下(99%),使用原生netpoll已經足夠了。

但是在一些海量并發連接下,原生netpoll會為每一個連接都開啟一個goroutine處理,也就是1千萬的連接就會創建一千萬個goroutine。

這就給了這些特殊場景下的優化空間,這也是像gnet和cloudwego/netpoll誕生的原因之一吧。

本質上他們的底層核心都是一樣的,都是基于epoll(linux)實現的。只是事件發生后,每個庫的處理方式會有所不同。

本篇文章主要分析gnet的。至于使用姿勢就不發了,gnet有對應的demo庫,可以自行體驗。

架構

直接引用gnet官網的一張圖:

gnet采用的是『主從多 Reactors』。也就是一個主線程負責監聽端口連接,當一個客戶端連接到來時,就把這個連接根據負載均衡算法分配給其中一個sub線程,由對應的sub線程去處理這個連接的讀寫事件以及管理它的死亡。

下面這張圖就更清晰了。

核心結構

我們先解釋gnet的一些核心結構。

engine就是程序最上層的結構了。

ln對應的listener就是服務啟動后對應監聽端口的監聽器。lb對應的loadBalancer就是負載均衡器。也就是當客戶端連接服務時,負載均衡器會選擇一個sub線程,把連接交給此線程處理。mainLoop 就是我們的主線程了,對應的結構eventloop。當然我們的sub線程結構也是eventloop。結構相同,不同的是職責。主線程負責的是監聽端口發生的客戶端連接事件,然后再由負載均衡器把連接分配給一個sub線程。而sub線程負責的是綁定分配給他的連接(不止一個),且等待自己管理的所有連接后續讀寫事件,并進行處理。

接著看eventloop。

netpoll.Poller:每一個 eventloop都對應一個epoll或者kqueue。buffer用來作為讀消息的緩沖區。connCoun記錄當前eventloop存儲的tcp連接數。 udpSockets和connetcions分別管理著這個eventloop下所有的udp socket和tcp連接,注意他們的結構map。這里的int類型存儲的就是fd。

對應conn結構。

這里面有幾個字段介紹下:

buffer:存儲當前conn對端(client)發送的最新數據,比如發送了三次,那個此時buffer存儲的是第三次的數據,代碼里有。inboundBuffer:存儲對端發送的且未被用戶讀取的剩余數據,還是個Ring Buffer。outboundBuffer:存儲還未發送給對端的數據。(比如服務端響應客戶端的數據,由于conn fd是不阻塞的,調用write返回不可寫的時候,就可以先把數據放到這里)

conn相當于每個連接都會有自己獨立的緩存空間。這樣做是為了減少集中式管理內存帶來的鎖問題。使用Ring buffer是為了增加空間的復用性。

整體結構就這些。

核心邏輯

當程序啟動時,

會根據用戶設置的options明確eventloop循環的數量,也就是有多少個sub線程。再進一步說,在linux環境就是會創建多少個epoll對象。

那么整個程序的epoll對象數量就是count(sub)+1(main Listener)。

上圖就是我說的,會根據設置的數量創建對應的eventloop,把對應的eventloop 注冊到負載均衡器中。

當新連接到來時,就可以根據一定的算法(gnet提供了輪詢、最少連接以及hash)挑選其中一個eventloop把連接分配給它。

我們先來看主線程,(由于我使用的是mac,所以后面關于IO多路復用,實現部分就是kqueue代碼了,當然原理是一樣的)。

Polling就是等待網絡事件到來,傳遞了一個閉包參數,更確切的說是一個事件到來時的回調函數,從名字可以看出,就是處理新連接的。

至于Polling函數。

邏輯很簡單,一個for循環等待事件到來,然后處理事件。

主線程的事件分兩種:

一種是正常的fd發生網絡連接事件。

一種是通過NOTE_TRIGGER立即激活的事件。

通過NOTE_TRIGGER觸發告訴你隊列里有task任務,去執行task任務。

如果是正常的網絡事件到來,就處理閉包函數,主線程處理的就是上面的accept連接函數。

accept連接邏輯很簡單,拿到連接的fd。設置fd非阻塞模式(想想連接是阻塞的會咋么樣?),然后根據負載均衡算法選擇一個sub 線程,通過register函數把此連接分配給它。

register做了兩件事,首先需要把當前連接注冊到當前sub 線程的epoll or kqueue 對象中,新增read的flag。

接著就是把當前連接放入到connections的map結構中 fd->conn。

這樣當對應的sub線程事件到來時,可以通過事件的fd找到是哪個連接,進行相應的處理。

如果是可讀事件。

到這里分析差不多就結束了。

總結

在gnet里面,你可以看到,基本上所有的操作都無鎖的。

那是因為事件到來時,采取的都是非阻塞的操作,且是串行處理對應的每個fd(conn)。每個conn操作的都是自身持有的緩存空間。同時處理完一輪觸發的所有事件才會循環進入下一次等待,在此層面上解決了并發問題。

當然這樣用戶在使用的時候也需要注意一些問題,比如用戶在自定義EventHandler中,如果要異步處理邏輯,就不能像下面這樣開一個g然后在里面獲取本次數據。

而應該先拿到數據,再異步處理。

issues上有提到,連接是使用map[int]*conn存儲的。gnet本身的場景就是海量并發連接,內存會很大。進而big map存指針會對 GC造成很大的負擔,畢竟它不像數組一樣,是連續內存空間,易于GC掃描。

還有一點,在處理buffer數據的時候,就像上面看到的,本質上是將buffer數據copy給用戶一份,那么就存在大量copy開銷,在這一點上,字節的netpoll實現了Nocopy Buffer,改天研究一下。

關鍵詞: 負載均衡 監聽端口 異步處理 當前連接 的原因之一

上一篇:

下一篇:

X 關閉

X 關閉

久久国产精品一区二区三区四区,久色婷婷小香蕉久久,国产日韩欧美在线播放不卡,另类av一区二区
亚洲激情网站| 亚洲日本中文| 国产精品久久久久久久久久久久久久| 欧美日本韩国一区二区三区| 农村妇女精品| 99视频在线精品国自产拍免费观看| 欧美精品一区二区三区在线播放| 久久夜色精品| 亚洲制服少妇| 久久都是精品| 亚洲人成在线观看网站高清| 国产一区二区三区成人欧美日韩在线观看| 国产日本亚洲高清| 亚洲二区在线观看| 欧美日韩美女一区二区| 亚洲第一免费播放区| 国产欧美日韩视频一区二区| 欧美成人精品三级在线观看| 欧美日韩成人在线视频| 国产一区二区三区在线免费观看| 亚洲精品在线看| 亚洲福利视频一区| 在线播放日韩欧美| 老司机精品视频一区二区三区| 亚洲破处大片| 亚洲国产精品久久精品怡红院| 国产揄拍国内精品对白| 一区二区三区日韩欧美| 亚洲二区三区四区| 欧美一区二区播放| 国产一区香蕉久久| 国产日韩欧美在线视频观看| 国产精品手机视频| 亚洲精品三级| 欧美国产视频一区二区| 亚洲福利在线观看| 国产精品免费aⅴ片在线观看| 国产一区二区三区久久久久久久久| 国产精品色婷婷| 欧美在线视频免费| 亚洲激情电影中文字幕| 国产精品夜夜夜一区二区三区尤| 久久久99国产精品免费| 国产一区二区精品久久99| 国产精品美女久久久久久2018| 久久裸体艺术| 久久综合久久综合久久| 久久久91精品| 欧美日韩国产欧美日美国产精品| 久久久亚洲国产美女国产盗摄| 亚洲少妇最新在线视频| 国产精品三上| 欧美日韩视频在线一区二区| 国产精品一区二区三区成人| 亚洲欧洲日韩在线| 亚洲精品综合精品自拍| 在线观看中文字幕亚洲| 久久精品91久久香蕉加勒比| ●精品国产综合乱码久久久久| 激情成人综合网| 亚洲激情电影在线| 久久综合网色—综合色88| 久久成人av少妇免费| 亚洲大片在线| 国产精品毛片va一区二区三区| 国产精品亚洲精品| 很黄很黄激情成人| 国产精品高清免费在线观看| 国产一区二区三区黄视频| 亚洲精品久久久久久久久久久久久| 日韩亚洲一区在线播放| 欧美三级网页| 国产欧美亚洲精品| 99精品国产99久久久久久福利| 亚洲私人黄色宅男| 亚洲国产日韩一级| 亚洲一本大道在线| 欧美欧美天天天天操| 欧美不卡一卡二卡免费版| 欧美激情第一页xxx| 国产精品扒开腿爽爽爽视频| 国产欧美日韩另类视频免费观看| 欧美中在线观看| 亚洲永久免费av| 欧美成年人视频网站欧美| 一区二区三区在线视频播放| 欧美中文在线视频| 亚洲人成毛片在线播放女女| 欧美精品激情在线| 在线播放视频一区| 亚洲人成网站精品片在线观看| 国产亚洲精品久久久| 久久青青草综合| 久久久久国产精品www| 羞羞视频在线观看欧美| 国产精品亚洲美女av网站| 欧美在线一级va免费观看| 欧美伊人影院| 亚洲香蕉在线观看| 欧美精品九九99久久| 久久精品国产一区二区三| 欧美电影在线观看| 欧美激情一区二区三区在线视频| 正在播放亚洲一区| 亚洲黄色免费| 国产精品一区二区久激情瑜伽| 欧美日韩一区二区三区在线| 亚洲第一免费播放区| 久久av免费一区| 国产精品久久久久久久久久妞妞| 欧美日韩成人综合在线一区二区| 狠狠色狠狠色综合系列| 亚洲精品久久嫩草网站秘色| 国产日韩精品综合网站| 久久久久一区| 亚洲大片精品永久免费| 久久久久免费观看| 在线播放中文字幕一区| 欧美日本二区| 在线亚洲高清视频| 亚洲午夜精品17c| 国产精品福利片| 亚洲看片一区| 欧美www视频在线观看| 亚洲视频二区| 狠狠久久五月精品中文字幕| 欧美日韩二区三区| 另类天堂视频在线观看| 一区二区av在线| 伊人成人在线视频| 久久精品一区二区三区中文字幕| 欧美一区二区三区在线播放| 欧美精品乱码久久久久久按摩| 香蕉久久一区二区不卡无毒影院| 免费在线看一区| 国产精品一区二区黑丝| av成人动漫| 欧美夜福利tv在线| 久久av一区| 欧美日韩一区自拍| 欧美激情网站在线观看| 在线观看日韩av先锋影音电影院| 国产精品久久二区| 亚洲三级免费| 欧美与黑人午夜性猛交久久久| 久久人人97超碰人人澡爱香蕉| 蜜臀va亚洲va欧美va天堂| 在线免费观看成人网| 在线观看欧美视频| 最新成人在线| 一区久久精品| 女生裸体视频一区二区三区| 国产精品一区免费视频| 欧美日韩一本到| 国产精品美女久久久久aⅴ国产馆| av成人福利| 亚洲视频一区| 欧美日韩国产一区二区三区地区| 伊甸园精品99久久久久久| 亚洲中无吗在线| 亚洲成人资源网| 久久青草欧美一区二区三区| 亚洲黄色免费电影| 韩国一区二区在线观看| 午夜在线播放视频欧美| 国产精品一区二区欧美| 亚洲午夜精品一区二区三区他趣| 欧美成年人视频网站欧美| 欧美母乳在线| 久久久精品性| 亚洲网站在线播放| 国产精品ⅴa在线观看h| 亚洲风情亚aⅴ在线发布| 亚洲小说春色综合另类电影| 国产日韩亚洲欧美综合| 国产日韩一区欧美| 亚洲网站在线观看| 日韩天堂av| 国产精品美女一区二区在线观看| 久久高清国产| 国产综合在线看| 国产一区二区三区久久久| 亚洲精品国产精品国自产观看| 久久综合色综合88| 黑人操亚洲美女惩罚| 国产精品久久久久久久久免费| 国产精品成人观看视频国产奇米| 亚洲图片欧美日产| 在线播放中文一区| 国产亚洲日本欧美韩国| 日韩视频在线播放| 蜜桃av综合| 亚洲私拍自拍| 国产精品国内视频| 久久一区亚洲| 欧美伦理一区二区| 国产精品综合视频| 欧美日韩精品一区二区三区四区| 国产精品videossex久久发布| 一区二区三区亚洲|