aio-enhance(音譯:硬漢) 是一款無侵入式的 Java AIO 內核增強類庫(注意:這不是一款通信框架),解決原生 AIO 架構設計中存在的缺陷,提供更高效、更穩定的通信能力。
aio-enhance 採用了 NIO 技術實現了一套全新的異步 IO 模型,兼容完整的 Java AIO 接口。用戶可自由選擇 Java 原生提供的,或者 aio-enhance 增強的 AIO 實現,架構如下圖。
一、項目背景2.1 解決平臺兼容性問題。
Java 原生 AIO 在 Mac 作業系統下存在兼容性問題,進行性能壓測會偶發性的系統崩潰。
2.2 修復官方 AIO 架構缺陷
Java 原生 AIO 在底層架構設計上存在缺陷(參考:Java AIO通信模型)。多核 CPU 環境下處理高並發請求,會引發比較嚴重的鎖競爭現象,以致無法充分發揮機器性能。
普通4核機器競爭壓力不大,AIO 的運行表現實測優於NIO。但隨著 CPU 核數的增加,AIO 的性能優勢逐漸下降。
2.3 優化 AIO 線程模型
Java AIO 相較於 NIO 多了一層異步線程模型,極大降低了開發人員的編程難度。但是通信過程中的 accept、connect、read、write 等事件都是復用同一組線程資源,容易造成讀寫回調進入死鎖狀態。 AIO通信框架在設計上需要特別關注這一點,但如果引入 aio-enhance 則無此顧慮。
二、適用場景如果您符合以下幾個條件,aio-enhance 會是一個不錯的選擇。
任何基於 Java AIO 實現的通信框架,如:smart-socket; 對高並發實時性有嚴苛要求; 多核CPU環境(至少4核以上)三、更新內容 優化:單次讀寫回調事件只觸發一次 IO 操作,減少read/write結果為0的頻次。 優化:將異步回調事件的遞歸計數器由 AtomicInteger 類型調整為 int 類型。 優化:簡化 Selector 的處理邏輯。 優化:簡化 SelectionKey.interestOps 的處理邏輯四、集成步驟一:依賴
引入增強包:aio-enhance.jar。可以通過maven方式引入依賴,亦可直接下載 jar 包並導入classpath。
<dependency> <groupId>org.smartboot.aio</groupId> <artifactId>aio-enhance</artifactId> <version>1.0.2</version></dependency>
步驟二:啟動
可以通過硬編碼的方式設置系統屬性,如下:
System.setProperty("java.nio.channels.spi.AsynchronousChannelProvider", "org.smartboot.aio.EnhanceAsynchronousChannelProvider");
也可在 java 啟動命令行中設置,如下:
java -Djava.nio.channels.spi.AsynchronousChannelProvider=org.smartboot.aio.EnhanceAsynchronousChann