當前位置:網站首頁>公司CTO:高性能開發(1),jvm原理面試題

公司CTO:高性能開發(1),jvm原理面試題

2021-08-19 22:15:01 程序員uauc

**CTO:**慢著!這是什麼情况?項目分配下去了,怎麼能又安排其他同事來加班做呢?

**主管:**總監,項目這個版塊涉及到高性能的開發,這個同事可能搞不定,眼看著項目要上線了,還是讓經驗豐富的工程師來做吧!

**CTO(凶狠的對著程序員):**那也不行,拿著這麼高的工資,這都做不了,Netty都不會用,你怎麼好意思拿20K的?

**某程序員(委屈地):**大佬,我每個月只有8K…

CTO:…哦,算了,當我沒來


我不記得是誰跟我說過,“十個高性能,九個用Netty”,我也不知道是騙我的還是咋的…

Netty到底有這麼重要嗎?

我翻閱了一下我手中的各大廠面試真題,問BIO、NIO、异步這一塊的也有,Netty出現的頻次不算很高,也許我看的是初中級的面試題吧。

無論怎麼說,想要漲薪昇職,高性能、高並發、高可用你就不得不會。

這裏,我就來分享一些Netty相關的核心技術點:

注:由於篇幅原因,我就簡單的提取其中部分,獲取完整內容及高清導圖,私信【高性能】免費領取!

Netty 原理

Netty 是一個高性能、异步事件驅動的 NIO 框架,基於 JAVA NIO 提供的 API 實現。它提供了對TCP、UDP 和文件傳輸的支持,作為一個异步 NIO 框架,Netty 的所有 IO 操作都是异步非阻塞的,通過 Future-Listener 機制,用戶可以方便的主動獲取或者通過通知機制獲得 IO 操作結果。

Netty 高性能

在 IO 編程過程中,當需要同時處理多個客戶端接入請求時,可以利用多線程或者 IO 多路複用技術進行處理。IO 多路複用技術通過把多個 IO 的阻塞複用到同一個 select 的阻塞上,從而使得系統在單線程的情况下可以同時處理多個客戶端請求。與傳統的多線程/多進程模型比,I/O 多路複用的最大優勢是系統開銷小,系統不需要創建新的額外進程或者線程,也不需要維護這些進程和線程的運行,降低了系統的維護工作量,節省了系統資源。

與 Socket 類和 ServerSocket 類相對應,NIO 也提供了 SocketChannel 和 ServerSocketChannel兩種不同的套接字通道實現。

1、多路複用通訊方式

Netty 架構按照 Reactor 模式設計和實現,它的服務端通信序列圖如下:

客戶端通信序列圖如下:

Netty 的 IO 線程 NioEventLoop 由於聚合了多路複用器 Selector,可以同時並發處理成百上千個客戶端 Channel,由於讀寫操作都是非阻塞的,這就可以充分提昇 IO 線程的運行效率,避免由於頻繁 IO 阻塞導致的線程掛起。

  • 异步通訊 NIO

由於 Netty 采用了异步通信模式,一個 IO 線程可以並發處理 N 個客戶端連接和讀寫操作,這從根本上解决了傳統同步阻塞 IO 一連接一線程模型,架構的性能、彈性伸縮能力和可靠性都得到了極大的提昇。

  • 零拷貝(DIRECT BUFFERS 使用堆外直接內存)

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

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

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

  • 內存池(基於內存池的緩沖區重用機制)

隨著 JVM 虛擬機和 JIT 即時編譯技術的發展,對象的分配和回收是個非常輕量級的工作。但是對於緩沖區 Buffer,情况卻稍有不同,特別是對於堆外直接內存的分配和回收,是一件耗時的操作。為了盡量重用緩沖區,Netty 提供了基於內存池的緩沖區重用機制。

  • 高效的 Reactor 線程模型

常用的 Reactor 線程模型有三種,Reactor 單線程模型, Reactor 多線程模型, 主從 Reactor 多線程模型。

Reactor 單線程模型

指的是所有的 IO 操作都在同一個 NIO 線程上面完成,NIO 線程的職責如下:

  1. 作為 NIO 服務端,接收客戶端的 TCP 連接;

總結:繪上一張Kakfa架構思維大綱腦圖(xmind)

image

其實關於Kafka,能問的問題實在是太多了,扒了幾天,最終篩選出44問:基礎篇17問、進階篇15問、高級篇12問,個個直戳痛點,不知道如果你不著急看答案,又能答出幾個呢?

若是對Kafka的知識還回憶不起來,不妨先看我手繪的知識總結腦圖(xmind不能上傳,文章裏用的是圖片版)進行整體架構的梳理

 資料領取方式:點擊這裏免費下載

梳理了知識,刷完了面試,如若你還想進一步的深入學習解讀kafka以及源碼,那麼接下來的這份《手寫“kafka”》將會是個不錯的選擇。

  • Kafka入門

  • 為什麼選擇Kafka

  • Kafka的安裝、管理和配置

  • Kafka的集群

  • 第一個Kafka程序

  • Kafka的生產者

  • Kafka的消費者

  • 深入理解Kafka

  • 可靠的數據傳遞

  • Spring和Kafka的整合

  • SpringBoot和Kafka的整合

  • Kafka實戰之削峰填穀

  • 數據管道和流式處理(了解即可)

image

image

版權聲明
本文為[程序員uauc]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2021/08/20210819221500815t.html

隨機推薦