Java面試擴展:對比Java標準NIO類庫,你知道Netty是如何實現更高性能的嗎

答:

Netty 在基礎的 NIO 等類庫之上進行了很多改進,例如:

1)更加優雅的 Reactor 模式實現、靈活的線程模型、利用 EventLoop 等創新性的機制,可以非常高效地管理成百上千的 Channel。

2)充分利用了 Java 的 Zero-Copy 機制,降低內存分配和回收的開銷。例如,使用池化的 Direct Buffer 等技術,在提高 IO 性能的同時,減少了對象的創建和銷燬;利用反射等技術直接操縱 SelectionKey,使用數組而不是 Java 容器等。

3)使用更多本地代碼。例如,直接利用 JNI 調用 Open SSL 等方式,獲得比 Java 內建 SSL 引擎更好的性能。

4)在通信協議、序列化等其他角度的優化。

 

Netty:它是一個異步的、基於事件 Client/Server 的網絡框架,目標是提供一種簡單、快速構建網絡應用的方式,同時保證高吞吐量、低延時、高可靠性。Netty > java.nio + java. net!

Netty 官方提供的 Server 部分:

ServerBootstrap,服務器端程序的入口,這是 Netty 爲簡化網絡程序配置和關閉等生命週期管理,所引入的 Bootstrapping 機制。我們通常要做的創建 Channel、綁定端口、註冊 Handler 等,都可以通過這個統一的入口,以 Fluent API 等形式完成,相對簡化了 API 使用。與之相對應, Bootstrap則是 Client 端的通常入口。

Channel,作爲一個基於 NIO 的擴展框架,Channel 和 Selector 等概念仍然是 Netty 的基礎組件,但是針對應用開發具體需求,提供了相對易用的抽象。

EventLoop,這是 Netty 處理事件的核心機制。例子中使用了 EventLoopGroup。我們在 NIO 中通常要做的幾件事情,如註冊感興趣的事件、調度相應的 Handler 等,都是 EventLoop 負責。

ChannelFuture,這是 Netty 實現異步 IO 的基礎之一,保證了同一個 Channel 操作的調用順序。Netty 擴展了 Java 標準的 Future,提供了針對自己場景的特有Future定義。

ChannelHandler,這是應用開發者放置業務邏輯的主要地方,也是我上面提到的“Separation Of Concerns”原則的體現。

ChannelPipeline,它是 ChannelHandler 鏈條的容器,每個 Channel 在創建後,自動被分配一個 ChannelPipeline。在上面的示例中,我們通過 ServerBootstrap 註冊了 ChannelInitializer,並且實現了 initChannel 方法,而在該方法中則承擔了向 ChannelPipleline 安裝其他 Handler 的任務。

Netty採用Reactor線程模型:這裏面主要有三種Reactor線程模型。分別是單線程模式、主從Reactor模式、多Reactor線程模式。其都可以通過初試和EventLoopGroup進行設置。其主要區別在於,單Reactor模式就是一個線程,既進程處理連接,也處理IO。類似於我們傳統的OIO編程。主從Reactor模式,其實就是將監聽連接和處理IO的分開在不同的線程完成。最後,主從Reactor線程模型,爲了解決多Reactor模型下單一線程性能不足的問題。改爲了一組線程池進行處理。官方默認的是採用這種主從Reactor模型。其線程數默認爲CPU內核的2倍

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章