精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

老面試官竟問我 Reactor 在 Netty 中是如何實現的

開源
這篇其實也算是一個面試點,畢竟 Reactor 也是可能被問到的,讓我們來看看 Reactor 具體是如何在 Netty 中落地實現的。

本文轉載自微信公眾號「yes的練級攻略」,作者是Yes呀。轉載本文請聯系yes的練級攻略公眾號。

你好,我是yes。

開年第一篇技術文哈,這是之前的存貨,最近一段時間的更新還是會以面試題為主,畢竟金三銀四哈。

這篇其實也算是一個面試點,畢竟 Reactor 也是可能被問到的,讓我們來看看 Reactor 具體是如何在 Netty 中落地實現的。

可以加深下對 Reactor 的印象,還有 Reactor 模型的演進過程。

對了,之前已經寫了一篇對 Reactor 的理解,沒看過的建議先看那篇,然后再來看這篇。

話不多說,發車!

Netty 的 Reactor

我們都知道 Netty 可以有兩個線程組,一個是 bossGroup,一個是 workerGroup。

之前也提到了 bossGroup 主要是接待新連接(老板接活),workerGroup 是負責新連接后續的一切 I/O (員工干活)

對應到 Reactor 模型中,bossGroup 中的 eventLoop 就是主 Reactor。它的任務就是監聽等待連接事件的到來,即 OP_ACCEPT。

然后創建子 channel ,從 workerGroup 中選擇一個 eventLoop ,將子 channel 與這個 eventLoop 綁定,之后這個子 channel 對應的 I/O事件,都由這個 eventLoop 負責。

而這個 workerGroup 中的 eventLoop 就是所謂的子 Reactor,它的任務就是負責已經建連完畢的連接之后的所有 I/O 請求。

其實從 eventLoop 這個名字就能看出,它的作用就是 loop event,說白了就是一個線程,死循環的等待事件的發生,然后根據不同的事件類型進行不一樣的后續處理,僅此而已。

正常情況下 bossGroup 只會配置一個 eventLoop,即一個線程,因為一般服務只會暴露一個端口,所以只要一個 eventLoop 監聽這個端口,然后 accept 連接。

而 workerGroup 在 Netty 中,默認是 cpu 核心數*2,例如 4 核 CPU ,默認會在 workerGroup 建 8 個 eventLoop,所以就有 8 個子 Reactor。

所以正常 Netty 服務端的配置是,1個主 Reactor,多個從 Reactor,這就是所謂的主從 Reactor。

基本上現在的主流配置都是主從 Reactor。

關于 Reactor 模型的演進

在深入 Netty 的 Reactor 實現之前,我們先來看看,為什么會演變成主從 Reactor?

最開始的模型是單 Reactor 單線程 ,你可以理解成一個線程來即監聽新的連接,又要響應老的連接的請求,如果邏輯處理的很快,那沒有問題,看看人家 redis 就夠用,但是如果邏輯處理的慢,那就會阻塞其他請求。

所以就有了單 Reactor 多線程,還是由一個線程來監聽所有的底層 Socket,但是一些耗時的操作可以分配給線程池進行業務處理,這樣就不會因為邏輯處理慢導致 Reactor 的阻塞。

但是這個模型還會有瓶頸,即監聽新的連接和響應老的連接的請求都由一個線程處理,積累的老連接多了,有很多事件需要響應,就會影響新連接的接入,這就不太舒服了,況且我們現在都是多核 CPU,還差這么一個線程嗎?

所以就又演進成主從 Reactor,由一個線程,即主 Reactor 專門等待新連接的建連,然后創建多個線程作為子 Reactor,均勻的負責已經接入的老連接,這樣一來既不會影響接待新連接的速度,也能更好的利用多核 CPU 的能力響應老連接的請求。

這就是關于 Reactor 模型的演進了。

好了,接下來我們再看看 Netty 實現 Reactor 的核心類,我們現在一般都是用 NIO ,所以我們看 NioEventLoop 這個類。

友情提示,有條件建議在PC端看下面的內容,源碼類的手機上看不太舒服

NioEventLoop

前面我們已經提到一個 NioEventLoop 就是一個線程,那線程的核心肯定就是它的 run 方法。

基于我們的理解,我們知道這個 run 方法的主基調肯定是死循環等待 I/O 事件產生,然后處理事件。

事實也是如此, NioEventLoop 主要做了三件事:

  • select 等待 I/O 事件的發生
  • 處理發生的 I/O 事件
  • 處理提交至線程中的任務,包括提交的異步任務、定時任務、尾部任務。

首先折疊下代碼,可以看到妥妥的死循環,這也是 Reactor 線程的標配,這輩子無限只為了等待事件發生且處理事件。

在 Netty 的實現里,NioEventLoop 線程不僅要處理 I/O 事件,還需要處理提交的異步任務、定時任務和尾部任務,所以這個線程需要平衡 I/O 事件處理和任務處理的時間。

因此有個 selectStrategy 這樣的策略,根據判斷當前是否有任務在等待被執行,如果有則立即進行一次不會阻塞的 select 來嘗試獲取 I/O 事件,如果沒任務則會選擇 SelectStrategy.SELECT 這個策略。

從圖中也可以看到,這個策略會根據最近將要發生的定時任務的執行時間來控制 select 最長阻塞的時間。

從下面的代碼可以看到,根據定時任務即將執行的時間還預留了 5 微秒的時間窗口,如果 5 微秒內就要到了,那就不阻塞了,直接進行一個非阻塞的 select 立刻嘗試獲取 I/O 事件。

經過上面的這個操作,select 算是完畢了,最終會把就緒的 I/O 事件個數賦值給 strategy,如果沒有的話那 strategy 就是 0 ,接著就該處理 I/O 事件和任務了。

上面代碼我把重點幾個部分都框出來了,這里有個 selectCnt 來統計 select 的次數,這個用于處理 JDK Selector 空輪詢的 bug ,下面會提。

ioRatio 這個參數用來控制 I/O 事件執行的時間和任務執行時間的占比,畢竟一個線程要做多個事情,要做到雨露均沾對吧,不能冷落了誰。

可以看到,具體的實現是記錄 I/O 事件的執行時間,然后再根據比例算出任務能執行的最長的時間來控制任務的執行。

I/O 事件的處理

我們來看看 I/O 事件具體是如何處理的,也就是 processSelectedKeys 方法。

點進去可以看到,實際上會有兩種處理的方法,一種是優化版,一種是普通版。

這兩個版本的邏輯都是一樣的,區別就在于優化版會替換 selectedKeys 的類型,JDK 實現的 selectedKeys 是 set 類型,而 Netty 認為這個類型的選擇還是有優化的余地的。

Netty 用 SelectedSelectionKeySet 類型來替換了 set 類型,其實就是用數組來替換了 set

相比 set 類型而言,數組的遍歷更加高效,其次數組尾部添加的效率也高于 set,畢竟 set 還可能會有 hash沖突。當然這是 Netty 為追求底層極致優化所做的,我們平日的代碼沒必要這般“斤斤計較”,意義不大。

那 Netty 是通過什么辦法替換了這個類型呢?

反射。

看下代碼哈,不是很復雜:

這也能給我們提供一些思路,比方你調用三方提供的 jar 包,你無法修改它的源碼,但是你又想對它做一些增強,那么就可以仿照 Netty 的做法,通過反射來替換之~

我們打個斷點看下替換前后 selectedKey 的類型,之前是 HashSet:

替換了后就變成了 SelectedSelectionKeySet 了。

ok,現在我們再看下優化版的處理 I/O 事件的遍歷方法,和普通版邏輯一樣的,只是遍歷是利用數組罷了。

沒啥好說的,就那個幫助 GC 可以提一下,如果你看過很多開源軟件你就會發現有很多這樣的實現,直接置為 null 的語句,這是為了幫助 GC。

緊接著看下真正處理 I/O 事件的方法 processSelectedKey

可以看到,這個方法本質就是根據不同的事件進行不同的處理,實際上會將事件在對應的 channel 的 pipeline 上面傳播,并且觸發各種相應的自定義事件,我拿 OP_ACCEPT 事件作為例子分析。

針對 OP_ACCEPT 事件,unsafe.read 實際會調用 NioMessageUnsafe#read 方法。

從上面代碼來看,邏輯并不復雜,主要就是循環讀取新建立的子 channel,并觸發 ChannelRead 和 ChannelReadComplete 事件,使之在 pipeline 中傳播,期間就會觸發之前添加的 ServerBootstrapAcceptor#channelRead,將其分配給 workerGroup 中的 eventLoop ,即子 Reactor 線程。

當然,我們自定義的 handler 也可以實現這兩個事件方法,這樣對應的事件到來后,我們能進行相應的邏輯處理。

好了,Netty 的 OP_ACCEPT 事件處理分析到此結束,其他事件也是類似的,都會觸發相應的事件,然后在 pipeline 中傳遞,觸發不同 Channelhandler 的方法,進行邏輯處理。

以上,就是 Netty 實現的主從 Reactor 模型。

當然,Netty 也支持單 Reactor,無非就是不要 workerGroup,至于線程數也可以自行配置,十分靈活,不過現在一般用的都是主從 Reactor 模型。

最后

這篇不僅講了 Netty 的 Reactor 實現,也把 Netty 是如何處理 I/O 操作的部分也囊括了。

下篇關于 Netty 的再盤盤 pipeline 機制,這個責任鏈模式也是很重要的,很有啟發性。

等 pipeline 寫完之后,你對 Netty 整體應該有一個比較清晰的認識了,然后會開始寫一些粘包半包、內存管理等內容,包括一些 Netty 的“高級”用法啥的,總之大概還有一半的內容沒寫,等寫完之后,完整的回顧一遍,出去可以拿 Netty “吹”了。

好嘞,等我更新哈,不多BB了。


責任編輯:武曉燕 來源: yes的練級攻略
相關推薦

2021-05-20 08:54:16

Go面向對象

2024-10-15 10:00:06

2024-02-04 10:08:34

2024-12-25 15:44:15

2021-12-02 08:19:06

MVCC面試數據庫

2024-06-04 09:02:03

2022-05-24 08:03:28

InnoDBMySQL數據

2025-10-28 02:00:00

2025-03-21 00:00:05

Reactor設計模式I/O 機制

2021-07-15 07:23:25

React動畫頁面

2024-05-30 08:04:20

Netty核心組件架構

2025-02-26 12:19:52

2021-09-27 07:11:18

MySQLACID特性

2024-12-30 13:58:14

2022-03-04 08:10:35

NettyIO模型Reactor

2025-09-03 04:00:00

小紅書Feed流系統

2020-04-16 08:22:11

HTTPS加解密協議

2010-08-23 15:06:52

發問

2024-02-20 14:10:55

系統緩存冗余

2024-09-11 22:51:19

線程通訊Object
點贊
收藏

51CTO技術棧公眾號

国产有码一区二区| 久久国产一区二区三区| 黄色免费观看视频网站| 午夜激情小视频| 日韩精彩视频在线观看| xvideos亚洲| 中文字幕第九页| 高清电影一区| 亚洲综合激情网| 欧洲精品国产| 亚洲AV无码精品国产| 香蕉久久国产| 九九久久综合网站| 夜夜春很很躁夜夜躁| 一本一道久久a久久| 日本高清不卡一区| 国产精品69久久久| 中文字幕日本在线| 99精品欧美一区二区三区小说| 国产精品va在线播放| 久久精品性爱视频| 色琪琪久久se色| 亚洲精品视频久久| 亚洲成人激情小说| 78精品国产综合久久香蕉| 亚洲一级片在线观看| 亚洲一区二区三区加勒比 | 99超碰麻豆| 免费看污视频的网站| 亚洲激情女人| 欧美成人免费全部| 少妇高潮惨叫久久久久| 欧美**字幕| 亚洲精品99久久久久中文字幕| 午夜免费一级片| 成人在线黄色| 日韩欧美中文在线| 国产深夜男女无套内射| 中文字幕在线观看网站| 国产精品久久毛片av大全日韩| 日本视频一区在线观看| 神马午夜在线观看| 丰满亚洲少妇av| 91av免费看| 国产精品人妻一区二区三区| 老色鬼精品视频在线观看播放| 国产成人精品综合久久久| 国产成人免费观看视频 | 国产成人精品av在线观| 激情欧美一区二区三区在线观看| 国产精品成人av性教育| 久草视频一区二区| 免费视频久久| 日本老师69xxx| 成人午夜淫片100集| 免费欧美日韩| 国产精品2018| 中文字幕一区二区久久人妻| 青青草97国产精品免费观看 | 拔插拔插海外华人免费| 国精产品一区一区三区mba下载| 亚洲人亚洲人成电影网站色| 久久观看最新视频| 日本天码aⅴ片在线电影网站| 亚洲一区在线看| 国产av国片精品| 欧美另类老肥妇| 色噜噜狠狠成人网p站| 日本美女高潮视频| 国产欧美自拍| 日韩三级免费观看| 精品无码av一区二区三区不卡| 99久久香蕉| 日韩精品在线观| 四虎成人免费影院| 91精品国产成人观看| 欧美交受高潮1| 九九热在线免费观看| 日韩专区一卡二卡| 成人黄色av网站| 亚洲成人久久精品| 久久综合色一综合色88| 亚洲天堂电影网| 色在线视频网| 色狠狠色噜噜噜综合网| 爱豆国产剧免费观看大全剧苏畅| 欧美黄视频在线观看| 亚洲精品xxxx| 九九九视频在线观看| 欧美 日韩 国产一区二区在线视频| 欧美国产日韩一区| 免费精品一区二区| 国产**成人网毛片九色| 欧美在线3区| gogo在线高清视频| 黑丝美女久久久| www.午夜av| 亚洲精品456| 久久伊人色综合| www.国产色| 国精产品一区一区三区mba视频 | 青青草一区二区| 国产日韩欧美中文字幕| 26uuu色噜噜精品一区二区| 亚洲亚洲精品三区日韩精品在线视频| 大黄网站在线观看| 欧美唯美清纯偷拍| 国产a级黄色片| 91日韩欧美| 日本不卡免费高清视频| 性欧美videos另类hd| 国产欧美一区二区三区在线老狼| 99久久久精品视频| 欧美一级做一级爱a做片性| 日韩电影大片中文字幕| 免费日韩在线视频| 久久99精品国产麻豆不卡| 久久久久久久久久码影片| 丝袜在线视频| 欧美另类高清zo欧美| 国产特级黄色录像| 99精品国产一区二区青青牛奶| 成人xvideos免费视频| 国产精品无码2021在线观看| 天天亚洲美女在线视频| 亚洲精品在线网址| 91久久夜色精品国产按摩| 国产精品99久久久久久人 | 色999日韩欧美国产| 7799精品视频天天看| 99精品在线免费| 国产手机视频在线观看| 成人在线视频观看| 亚洲精品福利视频| 日韩三级av在线| 成人av在线影院| 男人的天堂avav| 久久久久久久久成人| 日韩在线高清视频| 亚洲资源在线播放| 国产精品理伦片| 99国产精品久久久久久| 色综合色综合| 国产美女久久久| 浪潮av一区| 91精品国产色综合久久不卡电影| av黄色免费在线观看| 麻豆成人久久精品二区三区小说| 欧洲亚洲一区二区| 成人国产在线| 俺去了亚洲欧美日韩| 一级片视频播放| 中文字幕亚洲成人| 三级黄色片免费看| 欧美另类视频| 国产视频精品网| 天堂√8在线中文| 亚洲欧美综合v| 中文在线免费看视频| 国产精品污www在线观看| 久久久久久久久久一区二区| 婷婷伊人综合| 国产传媒欧美日韩| 亚洲伊人av| 中文欧美在线视频| 97在线视频人妻无码| 伊人色综合久久天天人手人婷| 91精品人妻一区二区三区四区| 亚洲免费高清| 亚洲春色在线视频| 国产精品欧美一区二区三区不卡 | 美女福利一区二区| 国产亚洲视频中文字幕视频| 国产又大又粗又硬| 亚洲制服丝袜在线| 欧美做受喷浆在线观看| 免费观看在线色综合| 老汉色影院首页| 美女av一区| 国产剧情日韩欧美| 欧美卡一卡二| 一区二区av在线| 性一交一乱一色一视频麻豆| 疯狂欧美牲乱大交777| 蜜桃av乱码一区二区三区| 国产精品一区二区无线| 国产欧美在线一区| 亚洲色图88| 欧美一进一出视频| 欧美一级大片在线视频| 91成人性视频| 中文字幕中文字幕在线中高清免费版| 日韩国产精品一区| 国产片高清在线观看| 黑丝美女久久久| 国产a免费视频| 久久夜色精品一区| 又黄又爽又色的视频| 久久久噜噜噜久久狠狠50岁| 国产成人免费高清视频| 日韩精品免费一区二区三区竹菊 | 国产videos久久| www.av一区视频| 成人国产综合| 欧美孕妇毛茸茸xxxx| 在线观看av免费| 最新亚洲国产精品| 污视频网站免费观看| 日韩一区二区免费高清| 欧美三级网站在线观看| 精品久久久久久久久久久久久| 男人晚上看的视频| 欧美激情一二三区| 亚洲成人日韩在线| 国产jizzjizz一区二区| 日本肉体xxxx裸体xxx免费| 一本一道久久综合狠狠老精东影业| 免费看av软件| 久久国产电影| 天堂精品视频| 精品国产91| 欧美日韩在线精品| 久久久久久久久久久久久久久久久久久久| 91久久中文字幕| 久久爱.com| 国产精品久久二区| 伊人久久综合一区二区| 午夜精品久久久久久久99热浪潮| 亚洲图区一区| 久久中文字幕在线视频| 99re在线视频| 亚洲人av在线影院| 欧洲一区av| 亚洲天堂av网| 久久手机免费观看| 亚洲热线99精品视频| 亚州男人的天堂| 日韩av中文字幕在线| 欧美熟妇交换久久久久久分类| 欧美成人三级电影在线| 国产99999| 日韩欧美成人激情| 精品国产999久久久免费| 欧美一级黄色片| 国产成人三级一区二区在线观看一| 欧美片网站yy| 91福利在线观看视频| 欧美精品久久99久久在免费线| 在线免费观看视频网站| 欧美日韩精品电影| 国产女同91疯狂高潮互磨| 9191成人精品久久| 99久久精品国产一区二区成人| 欧美一区二区在线免费播放| 国产手机精品视频| 日韩欧美国产电影| 日批视频免费播放| 亚洲欧美国产精品va在线观看| 免费看男男www网站入口在线| 国产亚洲精品美女久久久久| gogogo高清在线观看免费完整版| 久久精品国产91精品亚洲 | 日韩午夜电影网| 日本免费在线视频观看| 国产精品久久久久无码av| 女人床在线观看| 国产亚洲高清视频| 激情视频综合网| 狠狠色狠狠色合久久伊人| 老司机av网站| 久久午夜色播影院免费高清| 9.1片黄在线观看| 一区二区三区在线观看动漫| 免费在线观看黄网站| 欧美性xxxxxx少妇| 99视频在线观看免费| 亚洲电影免费观看| 东凛在线观看| 欧美日韩国产二区| 精品91久久| 亚洲jizzjizz日本少妇| 欧美日韩一本| youjizz.com亚洲| 亚洲经典自拍| 在线观看日本一区二区| 成人福利视频在线| 少妇av片在线观看| 亚洲午夜久久久| 中文在线观看av| 精品嫩草影院久久| av成人手机在线| 国内免费精品永久在线视频| 国产第一亚洲| 精品无人区一区二区三区竹菊| 久久免费大视频| 男女激情无遮挡| 国产综合色产在线精品| 波多野结衣 在线| 亚洲美女少妇撒尿| 波多野结衣电车痴汉| 精品免费日韩av| 黄av在线免费观看| 国产成人免费91av在线| 国产成人av毛片| 中国一区二区三区| 爽爽淫人综合网网站| 成人欧美精品一区二区| 国产精品乱子久久久久| 青草视频在线观看免费| 日韩视频一区二区| 在线免费黄色| 国产999精品久久久| 久久精品色综合| 国产精品视频一二三四区| 日本不卡123| 人人妻人人澡人人爽人人精品 | 国产精品一区二区三区四区在线观看 | av av片在线看| 日韩中文字幕在线视频播放| 欧美大片高清| 久久一区二区三区欧美亚洲| 在线看片成人| 极品白嫩少妇无套内谢| 亚洲天天做日日做天天谢日日欢 | 久草在线在线精品观看| 永久免费毛片在线观看| 在线免费观看不卡av| 深夜福利在线观看直播| 91国内在线视频| 国产亚洲成av人片在线观黄桃| 男人草女人视频| 国产高清不卡一区| 欧美日韩综合一区二区| 6080日韩午夜伦伦午夜伦| 免费av网站在线看| 成人国产在线视频| 99久久久久| 九九九久久久久久久| 亚洲欧美日韩久久| 99精品免费观看| 欧美区二区三区| 日韩三级久久| 久久艹国产精品| 成人动漫精品一区二区| 制服.丝袜.亚洲.中文.综合懂色| 亚洲国产精品中文| 蜜桃视频m3u8在线观看| 蜜桃av噜噜一区二区三区| 亚洲免费一区二区| 亚洲精品成人无码| 欧美三级日韩三级| 日本在线观看视频| 91国产在线免费观看| 极品裸体白嫩激情啪啪国产精品| av网页在线观看| 欧美性xxxx极品高清hd直播| 蜜桃视频在线免费| 国产精品视频大全| 亚州av乱码久久精品蜜桃| 国产精品偷伦视频免费观看了| 亚洲成人777| 美女欧美视频在线观看免费 | 超碰中文字幕在线观看| 亚洲日本欧美天堂| 欧美一级特黄aaaaaa大片在线观看 | 欧美一级精品在线| 91在线三级| 欧美日本韩国一区二区三区| 免费的成人av| 九九热精品免费视频| 日韩久久精品成人| 97久久网站| 妞干网视频在线观看| 久久久综合九色合综国产精品| 18国产免费视频| 九九热在线精品视频| 全球av集中精品导航福利| 香蕉视频网站入口| 一区二区三区精品| 欧美日韩视频精品二区| 成人妇女免费播放久久久| 亚洲视频碰碰| 成人无码av片在线观看| 欧美一区二区三区爱爱| 天堂av中文在线观看| 伊甸园精品99久久久久久| 成人免费视频播放| 中文字幕在线日亚洲9| 久久久久久久久久久91| blacked蜜桃精品一区| 国产精品19p| 在线观看视频一区二区欧美日韩 | 日本久久久a级免费| 亚洲情侣在线| a天堂中文字幕| 日韩欧美在线123| 日韩欧美精品电影| 日韩精品一区二区在线视频| 欧美韩国一区二区| 亚洲精品久久久蜜桃动漫 |