1. 程式人生 > >Netty(二):Netty為啥去掉支援AIO?

Netty(二):Netty為啥去掉支援AIO?

匠心零度 轉載請註明原創出處,謝謝!

疑惑

我們都知道bio nio 以及nio2(也就是aio),如果不是特別熟悉可以看看我之前寫的網路 I/O模型,那麼netty為什麼還經常看到類似下面的這段程式碼呢?

EventLoopGroup ……= new NioEventLoopGroup();
……
……
 b.group(……).channel(NioSocketChannel.class)……
……
……
ChannelFuture f = b.bind(PORT).sync();

不選擇bio模型我們知道,那麼為什麼不選擇aio模式呢?而還是選擇nio模式呢?這是一個值得思考的問題,我就一直很好奇,因為在

網路 I/O模型裡面介紹的,明顯AIO要比NIO模型還要好。

那麼為什麼Netty還是選擇的NIO模型呢?

Netty一些元件簡單介紹

Netty中這樣定義EventLoop的,本篇重點不在這裡,後續繼續介紹EventLoop。

Will handle all the I/O operations for a [Channel] once registered. One [EventLoop] instance will usually handle more than one [Channel] but this may depend on implementation details and internals.

Netty中這樣定義EventLoopGroup的,本篇重點不在這裡,後續繼續介紹EventLoopGroup。

Special [EventExecutorGroup] which allows registering [Channel]s that get processed for later selection during the event loop.

Netty中這樣定義Channel的,本篇重點不在這裡,後續繼續介紹Channel。

A nexus to a network socket or a component which is capable of I/O operations such as read, write, connect, and bind.

A channel provides a user:

  • the current state of the channel (e.g. is it open? is it connected?),
  • the [configuration parameters] of the channel (e.g. receive buffer size),
  • the I/O operations that the channel supports (e.g. read, write, connect, and bind), and
  • the [ChannelPipeline] which handles all I/O events and requests associated with the channel.

Netty中這樣定義ChannelFuture的,本篇重點不在這裡,後續繼續介紹ChannelFuture。

The result of an asynchronous [Channel] I/O operation.

All I/O operations in Netty are asynchronous. It means any I/O calls will return immediately with no guarantee that the requested I/O operation has been completed at the end of the call. Instead, you will be returned with a [ChannelFuture] instance which gives you the information about the result or status of the I/O operation.

A [ChannelFuture] is either uncompleted or completed. When an I/O operation begins, a new future object is created. The new future is uncompleted initially - it is neither succeeded, failed, nor cancelled because the I/O operation is not finished yet. If the I/O operation is finished either successfully, with failure, or by cancellation, the future is marked as completed with more specific information, such as the cause of the failure. Please note that even failure and cancellation belong to the completed state.

Netty提供的網路傳輸實現

備註: 這個是參考netty實戰書籍的。

看看RocketMQ裡面的寫法,等netty系列完成了,後續RocketMQ會繼續分析的。

備註:
If you are running on linux you can use EpollEventLoopGroup and so get better performance, less GC and have more advanced features that are only available on linux.

epoll對檔案描述符有兩種操作模式–LT(level trigger水平模式)和ET(edge trigger邊緣模式)

簡單來講,LT是epoll的預設操作模式,當epoll_wait函式檢測到有事件發生並將通知應用程式,而應用程式不一定必須立即進行處理,這樣epoll_wait函式再次檢測到此事件的時候還會通知應用程式,直到事件被處理。

而ET模式,只要epoll_wait函式檢測到事件發生,通知應用程式立即進行處理,後續的epoll_wait函式將不再檢測此事件。因此ET模式在很大程度上降低了同一個事件被epoll觸發的次數,因此效率比LT模式高。

解釋為什麼epoll預設是LT的原因(超哥解釋,個人覺得還是非常不錯的)
LT(level triggered):LT是預設的工作方式,並且同時支援block和no-block socket。在這種做法中,核心告訴你一個檔案描述符是否就緒了,然後你可以對這個就緒的fd進行IO操作。如果你不作任何操作,核心還是會繼續通知你的,所以,這種模式程式設計出錯誤可能性要小一點。傳統的select/poll都是這種模型的代表。

Netty為啥去掉支援AIO?

備註:總的來說可能支援AIO Not faster than NIO (epoll) on unix systems (which is true) 而且價效比不高,可能覺得不值得,反正netty已經封裝好,使用者呼叫起來也很簡單和底層用nio或者aio其實使用者不需要關心的,只要快就行。

由於自己水平問題,可能很多理解不到位,歡迎大家積極在留言區進行留言討論,感謝。在後面合適的機會我們繼續討論,AIO Not faster than NIO (epoll) on unix systems (which is true) 這是為什麼呢? 目前我還是先學習netty主幹,後續會繼續回到這個話題上面。

如果讀完覺得有收穫的話,歡迎點贊、關注、加公眾號【匠心零度】,查閱更多精彩歷史!!!

相關推薦

NettyNetty為啥去掉支援AIO?

匠心零度 轉載請註明原創出處,謝謝! 疑惑 我們都知道bio nio 以及nio2(也就是aio),如果不是特別熟悉可以看看我之前寫的網路 I/O模型,那麼netty為什麼還經常看到類似下面的這段程式碼呢? EventLoopGroup

Netty簡單的客戶端服務端demo

cat println 客戶端連接 監聽端口 rbo 異常 服務端 max auth 使用Java IO實現客戶端服務端 服務端監聽端口 客戶端連接服務端 客戶端循環寫數據到服務端 import java.io.IOException; import java.net.S

Netty服務端客戶端例項分析

package com.netty; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.ch

TensorFlow深度學習框架學習TensorFlow實現線性支援向量機SVM

SVM的原理可以參考李航的《統計學習方法》 具體程式碼如下,程式碼都有註釋的 #1、匯入必要的庫 import matplotlib.pyplot as plt import numpy as np import tensorflow as tf fro

機器學習7——支援向量機線性可分支援向量機到非線性支援向量機

線性可分支援向量機 回顧 前面總結了線性可分支援向量機,知道了支援向量機的最終目的就是通過“間隔最大化” 得到最優分類器,能夠使最難區分的樣本點得到最大的分類確信度,而這些難區分的樣本就是支援向量。 還是如下圖所示,超平面H1 和 H2 支撐著中間的決

Netty入門篇

1.2 技術 global 網絡 bili enc 9.png cti 不用 匠心零度 轉載請註明原創出處,謝謝! 說在前面 上篇文章對Netty進行了初探:Netty初探,主要介紹了下我們為什麽需要學習netty、netty介紹等;本篇文章接著上篇文章的內容。本篇為了

NettyServerBootstrap啟動流程

handle ops pipe 簡單的 inf and acc rest 時也 這篇文章主要是對ServerBootstrap啟動流程做一個梳理,方便我們串聯起各個類,同時也對主要的一些類有個大概的印象,方便之後逐個類的深入學習。 本篇文章不在具體貼出代碼,而是對整個啟動流

NettyEventLoop學習前導——Reactor模式

瞭解Netty的人多少都會知道Netty的高效能的一個原因就是它是基於事件驅動的,而這一事件的原型就是Reactor模式。 所以在學習EventLoop前,很有必要先搞懂Reactor模式。 本文目錄: 傳統的伺服器設計 Basic Reactor(單執行緒模式) MultiThreadR

Netty框架學習之(Netty元件簡介

1. 概覽 從高層次的角度來看Netty, 它主要為需要開發高效能應用的開發者解決了“技術”的和“體系結構”的問題。首先,它的基於 Java NIO 的非同步的和事件驅動的實現,保證了高負載下應用程式 效能的最大化和可伸縮性。其次, Netty 也包含了一組設計模式,將應用程式邏輯從網

一起學Netty之 Hello Netty的原型圖解

上一個小節,寫的一個入門的Hello Netty的案例,它的模型其實很簡單,我們畫個簡單的圖理解一下 package com.lyncc.netty.concept; /** * * @author Bazingalyncc * 描述: * 時間 2016年

自頂向下深入分析Netty--執行緒模型

上面這幅圖描述了netty的執行緒模型,其中mainReacotor,subReactor,Thread Pool是三個執行緒池。mainReactor負責處理客戶端的連線請求,並將accept的連線註冊到subReactor的其中一個執行緒上;subReactor負責處理客戶端通道上的資料讀

Netty網路傳輸中的拆包、粘包問題

問題來源:     在Netty中對於TCP傳輸的預設資料大小為1024位元組,當資料包不超過1024時,會一次接收完畢,當超過1024時,首先會進行拆分,即分成幾次傳輸,等到下次連線時將會改變一次

Netty高效能大容量Socket併發Netty效能測試

public class NettyCommandHandler extends ChannelHandlerAdapter { private int counter = 0; @Override public void channelRead(ChannelHandlerCont

Java NIO框架Nettynetty5例子,程式碼詳解

這是一個netty快速入門的例子,也是我的學習筆記,比較簡單,翻譯於官方的文件整理後把所有程式碼註釋放在每一行程式碼中間,簡單明瞭地介紹一些基礎的用法。 首頁這是基於netty5的例子,如果需要使用請依賴netty5的包。maven引用方式 <de

Netty基礎概念及訊息處理流程

1.  Netty是什麼?   Netty是由JBOSS提供的一個java開源網路通訊框架。Netty可以提供非同步的,非阻塞的,事件驅動的網路應用程式框架和工具,非常適合用來快速開發高效能、高可靠

精通併發與 Netty 常用的 rpc 框架

Google Protobuf 使用方式分析 對於 RPC 協議來說,最重要的就是物件的傳送與接收,這就要用到序列化與反序列化,也稱為編碼和解碼,序列化與反序列化和網路傳輸一般都在對應的 RPC 框架中完成。 序列化與反序列化的流程如下: JavaBean-> stub(client) <->

小林求職記說好的問基礎,為啥我感覺一點也不基礎呢?

在上一輪的面試中,小林在mysql方面因為作答不夠完善,被面試官吊打了一番。經過兩天的自我複習之後,新的一輪面試又開始了。 面試官:你好,請簡單介紹下自己吧。 小林:你好,我是xxxxxx,之前在深圳的xxx公司負責了xxx系統的研發設計。 面試官:嗯嗯,那我先來問你一些基礎問題吧。 小林:嗯嗯,好的。 面試

Javascript面向對象編程構造函數的繼承

沒有 cal type 這一 今天 nts 實現繼承 刪除 函數綁定 今天要介紹的是,對象之間的"繼承"的五種方法。 比如,現在有一個"動物"對象的構造函數。   function Animal(){     this.species = "動物";   } 還有一個

虛擬化虛擬化及vmware workstation產品使用

應該 server esxi aof 手機 text 產品 窗體 pass 虛擬化(一):虛擬化及vmware產品介紹 vmware workstation的最新版本號是10.0.2。相信大家也都使用過,當中的簡單的虛擬機的創建。刪除等,都非常easy

CSS3動畫波浪效果

col -1 loading ack css代碼 code load width ase 實現效果 如圖所示: 首先得準備三張圖,一張是淺黃色的背景圖loading_bg.png,一張是深紅色的圖loading.png,最後一張為bolang.png。 css代碼