Netty面試題

【基礎篇】
1、TCP、UDP的區別?
2、TCP協議如何保證可靠傳輸?
3、TCP的握手、揮手機制?
4、TCP的粘包/拆包原因及其解決方法是什麼?
5、Netty的粘包/拆包是怎麼處理的,有哪些實現?
6、同步與異步、阻塞與非阻塞的區別?
7、說說網絡IO模型?
8、BIO、NIO、AIO分別是什麼?
9、select、poll、epoll的機制及其區別?
10、說說你對Netty的瞭解?
11、Netty跟Java NIO有什麼不同,爲什麼不直接使用JDK NIO類庫?
12、Netty組件有哪些,分別有什麼關聯?
13、說說Netty的執行流程?

【netty篇】
1.Netty 是什麼?

Netty 是一款基於 NIO(Nonblocking I/O,非阻塞IO)開發的網絡通信框架,對比於 BIO(Blocking I/O,阻塞IO),他的併發性能得到了很大提高。難能可貴的是,在保證快速和易用性的同時,並沒有喪失可維護性和性能等優勢。

2.Netty 的特點是什麼?

高併發:Netty 是一款基於 NIO(Nonblocking IO,非阻塞IO)開發的網絡通信框架,對比於 BIO(Blocking I/O,阻塞IO),他的併發性能得到了很大提高。

傳輸快:Netty 的傳輸依賴於零拷貝特性,儘量減少不必要的內存拷貝,實現了更高效率的傳輸。

封裝好:Netty 封裝了 NIO 操作的很多細節,提供了易於使用調用接口。

3.什麼是 Netty 的零拷貝?

Netty 的零拷貝主要包含三個方面:

Netty 的接收和發送 ByteBuffer 採用 DIRECT BUFFERS,使用堆外直接內存進行 Socket 讀寫,不需要進行字節緩衝區的二次拷貝。如果使用傳統的堆內存(HEAP BUFFERS)進行 Socket 讀寫,JVM 會將堆內存 Buffer 拷貝一份到直接內存中,然後才寫入 Socket 中。相比於堆外直接內存,消息在發送過程中多了一次緩衝區的內存拷貝。

Netty 提供了組合 Buffer 對象,可以聚合多個 ByteBuffer 對象,用戶可以像操作一個 Buffer 那樣方便的對組合 Buffer 進行操作,避免了傳統通過內存拷貝的方式將幾個小 Buffer 合併成一個大的 Buffer。

Netty 的文件傳輸採用了 transferTo 方法,它可以直接將文件緩衝區的數據發送到目標 Channel,避免了傳統通過循環 write 方式導致的內存拷貝問題。

4.Netty 的優勢有哪些?

使用簡單:封裝了 NIO 的很多細節,使用更簡單。

功能強大:預置了多種編解碼功能,支持多種主流協議。

定製能力強:可以通過 ChannelHandler 對通信框架進行靈活地擴展。

性能高:通過與其他業界主流的 NIO 框架對比,Netty 的綜合性能最優。

穩定:Netty 修復了已經發現的所有 NIO 的 bug,讓開發人員可以專注於業務本身。

社區活躍:Netty 是活躍的開源項目,版本迭代週期短,bug 修復速度快。

5.Netty 的應用場景有哪些?

典型的應用有:阿里分佈式服務框架 Dubbo,默認使用 Netty 作爲基礎通信組件,還有 RocketMQ 也是使用 Netty 作爲通訊的基礎。

6.Netty 高性能表現在哪些方面?

IO 線程模型:同步非阻塞,用最少的資源做更多的事。

內存零拷貝:儘量減少不必要的內存拷貝,實現了更高效率的傳輸。

內存池設計:申請的內存可以重用,主要指直接內存。內部實現是用一顆二叉查找樹管理內存分配情況。

串形化處理讀寫:避免使用鎖帶來的性能開銷。

高性能序列化協議:支持 protobuf 等高性能序列化協議。

7.Netty 和 Tomcat 的區別?

作用不同:Tomcat 是 Servlet 容器,可以視爲 Web 服務器,而 Netty 是異步事件驅動的網絡應用程序框架和工具用於簡化網絡編程,例如TCP和UDP套接字服務器。

協議不同:Tomcat 是基於 http 協議的 Web 服務器,而 Netty 能通過編程自定義各種協議,因爲 Netty 本身自己能編碼/解碼字節流,所有 Netty 可以實現,HTTP 服務器、FTP 服務器、UDP 服務器、RPC 服務器、WebSocket 服務器、Redis 的 Proxy 服務器、MySQL 的 Proxy 服務器等等。

8.Netty 中有那種重要組件?

Channel:Netty 網絡操作抽象類,它除了包括基本的 I/O 操作,如 bind、connect、read、write 等。

EventLoop:主要是配合 Channel 處理 I/O 操作,用來處理連接的生命週期中所發生的事情。

ChannelFuture:Netty 框架中所有的 I/O 操作都爲異步的,因此我們需要 ChannelFuture 的 addListener()註冊一個 ChannelFutureListener 監聽事件,當操作執行成功或者失敗時,監聽就會自動觸發返回結果。

ChannelHandler:充當了所有處理入站和出站數據的邏輯容器。ChannelHandler 主要用來處理各種事件,這裏的事件很廣泛,比如可以是連接、數據接收、異常、數據轉換等。

ChannelPipeline:爲 ChannelHandler 鏈提供了容器,當 channel 創建時,就會被自動分配到它專屬的 ChannelPipeline,這個關聯是永久性的。

9.Netty 發送消息有幾種方式?

Netty 有兩種發送消息的方式:

直接寫入 Channel 中,消息從 ChannelPipeline 當中尾部開始移動;

寫入和 ChannelHandler 綁定的 ChannelHandlerContext 中,消息從 ChannelPipeline 中的下一個 ChannelHandler 中移動。

10.默認情況 Netty 起多少線程?何時啓動?

Netty 默認是 CPU 處理器數的兩倍,bind 完之後啓動。

11.Netty 支持哪些心跳類型設置?

readerIdleTime:爲讀超時時間(即測試端一定時間內未接受到被測試端消息)。

writerIdleTime:爲寫超時時間(即測試端一定時間內向被測試端發送消息)。

allIdleTime:所有類型的超時時間。

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