中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

線程模型Netty怎么用

發布時間:2021-10-21 10:06:32 來源:億速云 閱讀:145 作者:柒染 欄目:大數據

線程模型Netty怎么用,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

一.前言

眾所周知,netty是高性能的原因源于其使用的是NIO,但是這只是其中一方面原因,其IO模型上決定的。另一方面源于其線程模型的設計,良好的線程模型設計,能夠減少線程上下文切換,減少甚至避免鎖的競爭(無鎖化設計)帶來的開銷。

二.Reactor模式

Reactor模式是一種軟件程序設計模式,它由Jim Coplien和Douglas C. Schmidt在1995年發布,主要用于處理一個或者多個客戶端發起請求。

從一個客戶端連接到日志服務器,然后發送請求的兩個流程來看Reactor模式。其中有三種組件:

  • Dispacther:分發客戶端的請求事件

  • Acceptor:接受客戶端連接事件

  • Handler:處理客戶端發起的請求事件

1.客戶端連接到日志服務器

線程模型Netty怎么用

  1. 日志服務端注冊Acceptor至Dispatcher

  2. 日志服務端調用分發器內部的handle_events方法

  3. 分發器開始在多路監聽器(一般為OS的select、epoll)上等待客戶端請求

  4. 客戶端連接至日志服務器

  5. 分發器通知Acceptor連接事件

  6. Accetor接受一個新的連接

2.客戶端發送記錄日志的請求

線程模型Netty怎么用

  1. 客戶端使用上部分建立的連接發送記錄日志的請求

  2. 客戶端分發器將記錄日志的時間通知給Handler

  3. Handler處理讀請求然后內部在傳遞給下個Handler繼續處理

  4. 最終Handler進行寫響應

  5. 返回到分發器,分發器繼續事件循環等待處理下個事件

以上的幾種組件的作用和處理連接和請求事件的模式就是Reactor模式。

三.Scalable IO in Java

以上的Reactor模式只是簡單的設計模型,對于每種程序語言設計而言,仍然需要做一些改變。基于Java的NIO如何使用該模式構建高性能可伸縮的服務,并發大神Doug Lea在他的網站上發布過一篇論文《Scalable IO in Java》。

這篇論文中主要談及的話題是如何構建高性能可擴展的IO,其中就是基于Reactor模式進行了演進。

其中涉及到以下組件:

  • Reactor: 響應IO事件,分發至相應的Handlers

  • Handlers: 執行非阻塞的IO操作,

1.單線程Reactor模式

線程模型Netty怎么用

  1. 其中客戶端發送請求至服務端,Reactor響應其IO事件。

  2. 如果是建立連接的請求,則將其分發至acceptor,由其接受連接,然后再將其注冊至分發器。

  3. 如果是讀請求,則分發至Handler,由其讀出請求內容,然后對內容解碼,然后處理計算,再對響應編碼,最后發送響應

在整個過程中都是使用單線程,無論是Reactor線程和后續的Handler處理都只使用一個線程。

但是單線程無疑會降低性能,所以需要增加線程提供擴展。

2. 多線程Reactor模式

線程模型Netty怎么用

為了能夠提高擴展性,需要在單線程的模型上增加線程,主要從兩個方面利用多線程發揮多核的應用優勢:

  1. Worker Threads,Reactor應該能夠快速的觸發事件,防止Handler處理的延遲Reactor的響應導致事件積累,最終導致客戶端連接請求的積壓,甚至服務端的句柄數耗盡,服務停止響應。所以在Handlers的處理中使用工作多線程

  2. Multiple Reactor Threads,使用多個Reactor線程用于響應客戶端發起的事件,可以使用多個Reactor分擔負載

以上多線程的Reactor處理模式中,Reactor線程仍然是單線程,負責acceptor和IO read/send。但是對于請求的解碼以及業務處理和響應的編碼都是有work thread pool負責。

3.多Reactor模式

上述的多線程模式解決了Handler降低Reactor的響應,同時也提升了Handler的處理效率。但是Reactor仍然是單線程,對于大量的網絡事件,其仍然有負載壓力。為了能夠使用多線程分擔壓力,演進出多Reactor:

線程模型Netty怎么用

其中主Reactor響應用戶的連接事件,然后分發給acceptor,由其創建新的子Reactor。多個子Reactor分別處理各自的IO事件,比如read/write,然后再將其交給work thread pool進行解碼,業務處理,編碼。

多Reactor的設計通過將TCP連接建立和IO read/write事件分離至不同的Reactor,從而分擔單個Reactor的壓力,提升其響應能力。

四.Netty中的線程模型

在認識了Reactor設計模式和基于Reactor構建高性能可擴展的IO后,再來看netty的線程模型就顯得簡單的多了。

netty的線程模型設計正是Reactor模式的變種。以上的三種Reactor模式,在netty中都能非常好的得到了支持。在netty中主要通過參數配置來切換以上的各種模式。

netty中有EventLoopGroup和EventLoop兩個類,它們是實現Reactor的關鍵之所在。EventLoop正如其名,其中包包含一個Selector選擇器和一段循環邏輯。通過不斷循環獲取Selector上的就緒事件然后進行處理。EventLoopGroup是包含一組EventLoop的組,通過其可以產生一個EventLoop。

在閱讀了netty官網給出的Demo后,可以知道,在創建一個Server時都會創建兩個EventLoopGroup,分別為boss和work。前者用戶Main Reactor,后者用于Sub Reactor和WorkThreadPool。

每次Main Reactor通過Selector得到客戶端建立連接的請求后,就從work EventLoopGroup中獲取一個EventLoop,然后將建立的連接對應的Socket抽象SocketChannel綁定到EventLoop上,形成了新的Sub Reactor。

在了解了netty的線程模型后,下面首先看下各種模式下的netty的參數配置。

1.單線程Reactor配置

通過構造一個EventLoop,將其用作Reactor和WorkThread,即是單線程模式。

EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
EventLoop bossLoop = eventLoopGroup.next();
EventLoop workLoop = reactorLoop;
ServerBootstrap b = new ServerBootstrap();
b.group(reactorLoop, workLoop);

boss和work使用同一個EventLoop,可以實現單線程Reactor。

2.多線程Reactor配置

Reactor使用單線程,然后Work使用多線程,即是多線程模型。

EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
EventLoop bossLoop = eventLoopGroup.next();
EventLoopGroup workLoopGroup = new NioEventLoopGroup();
ServerBootstrap b = new ServerBootstrap();
b.group(reactorLoop, workLoopGroup);
3.多Reactor模式

以上的多線程Reactor模式,便是多Reactor模式。bossLoop是主Reactor,其通過事件循環創建TCP連接,然后將連接的SocketChannel抽象綁定到workLoopGroup中的EventLoop上,形成Sub Reactor。

只是Main Reactor是單線程進行事件循環。雖然也可以構造多線程,但是沒有什么實際意義。因為netty中在綁定端口時只會使用Group中的一個EventLoop綁定到Selector上,即是使用了EventLoopGroup。

當然對于同個應用如果監聽多個端口,使用多個ServerBootStrap共享一個boss,那樣Main Reactor也是多線程模式,才有意義。

看完上述內容,你們掌握線程模型Netty怎么用的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永和县| 富蕴县| 策勒县| 普陀区| 长寿区| 蓬溪县| 鄂州市| 上虞市| 紫阳县| 鹤壁市| 沁源县| 花垣县| 昌邑市| 常熟市| 正定县| 郴州市| 天津市| 仁布县| 安图县| 海原县| 鄱阳县| 嵊泗县| 平邑县| 灌云县| 利津县| 政和县| 绥芬河市| 武宁县| 通江县| 华安县| 桐城市| 思南县| 中宁县| 吉首市| 台北县| 错那县| 东阿县| 武陟县| 临潭县| 横峰县| 湘阴县|