Netty4詳解一:理解Netty的設計理念NIO
阿新 • • 發佈:2018-12-30
- 有一套統一的API來處理非同步和同步程式設計模式
- 使用非常靈活
- 簡單但卻強大的執行緒機制
- 業務元件分離方便重用
- 極小的縮減不必要的Memory Copy
二、非同步程式設計模式設計 一般來說網路程式設計都會面臨著併發問題,那麼我們就來看一下為何非同步程式設計模式會很好的解決這個問題,其實這也就詮釋了netty背後的設計思想。 在現在,瓶頸總是在IO處理上,非同步的處理方式就是你可以不用一直等待任務(IO)處理完成,而是在任務進行的時候還可以做其它事情。那麼如何實現這個呢?讓我們來認識一下實現非同步的兩種處理方式: CallBack:
在NIO中,不得不提到的是關於抽象的資料容器ByteBuffer,ByteBuffer允許相同的資料在不同ByteBuffer之間共享而不需要再拷貝一次來處理。Slicing-ByteBuffer允許建立一個新的ByteBuffer通過暴露一個子邊界的形式共享原ByteBuffer的資料,這就大大減少了在資料處理過程中記憶體的copy(Zero-copy)。ByteBuffer通過一些索引來記錄讀寫的資訊,當你向其中寫資料時,它會自動跟蹤你寫到ByteBuffer的位置,類似,他也會自動跟蹤你讀的位置。而且ByteBuffer還提供了很多方法讓你切換讀寫模式(flip)或者清空(clear)或者壓縮(compact)等。 關於Selectors,NIOAPI通過selector來處理網路事件和資料。一個Channel代表一個網路連線。Selector的作用就是來決定這些Channel是否已準備好讀或者寫操作,一個selector可以處理很多連線請求,這就解決了為一個連線建立一個執行緒的問題。要想用一個selector需要以下步驟: 1.建立一個或多個selector用來給開啟的channels註冊。 2.當一個channel註冊後,就需要來確定哪種事件需要你監聽,通常有四種事件: OP_ACCEPT OP_CONNECT OP_READ OP_WRITE 3.當channels被註冊後,你需要呼叫Selector.select()方法來阻塞直到上述事件發生。 4.當方法沒有阻塞時,你會獲得所有SelectionKey例項,這些例項包含了已註冊channel的引用和其狀態,這樣你就可以做你的操作了。 三、Netty VS JavaNIO
4.解決了著名的epoll bug