為什麼Netty使用NIO而不是AIO?

為什麼Netty使用NIO而不是AIO?

NIO模型

同步非阻塞

NIO有同步阻塞和同步非阻塞兩種模式,一般講的是同步非阻塞,服務器實現模式為一個請求一個線程,但客戶端發送的連接請求都會註冊到多路複用器上,多路複用器輪詢到連接有I/O請求時才啟動一個線程進行處理。

AIO模型

異步非阻塞

服務器實現模式為一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務器應用去啟動線程進行處理,

注:AIO又稱為NIO2.0,在JDK7才開始支持。

為什麼Netty使用NIO而不是AIO?

  1. Netty不看重Windows上的使用,在Linux系統上,AIO的底層實現仍使用EPOLL,沒有很好實現AIO,因此在性能上沒有明顯的優勢,而且被JDK封裝了一層不容易深度優化
  2. Netty整體架構是reactor模型, 而AIO是proactor模型, 混合在一起會非常混亂,把AIO也改造成reactor模型看起來是把epoll繞個彎又繞回來
  3. AIO還有個缺點是接收數據需要預先分配緩存, 而不是NIO那種需要接收時才需要分配緩存, 所以對連接數量非常大但流量小的情況, 內存浪費很多
  4. Linux上AIO不夠成熟,處理回調結果速度跟不到處理需求,比如外賣員太少,顧客太多,供不應求,造成處理速度有瓶頸(待驗證)
為什麼Netty使用NIO而不是AIO?

作者原話:

Not faster than NIO (epoll) on unix systems (which is true)

There is no daragram suppport

Unnecessary threading model (too much abstraction without usage)

為什麼Netty使用NIO而不是AIO?


分享到:


相關文章: