<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一文搞定Netty接收數(shù)據(jù)的原理

          共 1274字,需瀏覽 3分鐘

           ·

          2020-12-29 14:09


          ? 點擊上方“JavaEdge”,關(guān)注公眾號

          設(shè)為“星標”,好文章不錯過!

          1 Netty讀數(shù)據(jù)的技巧




          1.1 AdaptiveRecvByteBufAllocator


          自適應(yīng)數(shù)據(jù)大小的分配器。打水時,拿多大桶去裝?

          小了不夠,大了浪費。所以根據(jù)自己實際裝預(yù)估下次情況,從而決定下次帶多大桶。

          AdaptiveRecvByteBufAllocator對bytebuf的猜測

          • 直接放大

          • 謹慎縮小( 需連續(xù)2次判斷)




          1.2 defaultMaxMessagesPerRead


          連續(xù)讀。
          排隊打水時,假設(shè)當(dāng)前桶裝滿了,這時你會覺得可能還要打點水才夠用,所以直接拿個新桶等裝,而非回家,直到后面出現(xiàn)

          • 有桶沒有裝滿

          • 裝了很多桶了,需要給別人留個機會

          等原因才停止,回家。

          2 執(zhí)行流程


          如下都是worker線程的事。

          多路復(fù)用器( Selector )接收到OP_READ事件
          處理OP_READ事件:NioSocketChannel.NioSocketChannelUnsafe.read()

          • 分配一個初始1024字節(jié)的byte buffer來接受數(shù)據(jù)

          • 從Channel接受數(shù)據(jù)到byte buffer

          • 記錄實際接受數(shù)據(jù)大小,調(diào)整下次分配byte buffer大小

          • 觸發(fā) pipeline.fireChannelRead(byteBuf)把讀取到的數(shù)據(jù)傳播出去

          • 判斷接受byte buffer是否滿載而歸:是,嘗試繼續(xù)讀取直到?jīng)]有數(shù)據(jù)或滿16次;否,結(jié)束本輪讀取,等待下次OP_READ事件


          和連接事件類似,我們肯定還是主要在 NioEventLoop

          此處先處理的 OP_ACCEPT 建立連接事件,直接讓它過了

          這次來的才是處理讀請求的

          3 讀取數(shù)據(jù)的根本 API


          sun.nio.ch.SocketChannellmpl#read(java.nio.ByteBuffer)

          4 read方法區(qū)別


          • NioSocketChannel#read 讀數(shù)據(jù)

          • NioServerSocketChannel#read 創(chuàng)建連接


          5 fireChannelRead區(qū)別


          • pipeline.fireChannelReadComplete()
            一次讀事件處理完成

          • pipeline fireChannelRead(byteBuf)
            一次讀數(shù)據(jù)完成, 一次讀事件處理可能會包含多次讀數(shù)據(jù)操作

          6 為啥最多只嘗試讀16次?


          給別人留機會。


          往期推薦


          大廠如何解決數(shù)值精度/舍入/溢出問題

          大廠數(shù)據(jù)庫事務(wù)實踐-事務(wù)生效就能保證正確回滾?

          線上問題事跡(一)數(shù)據(jù)庫事務(wù)居然都沒生效?

          硬核干貨:HTTP超時、重復(fù)請求必見坑點及解決方案

          給大忙人們看的Java NIO教程之Channel





          目前交流群已有?800+人,旨在促進技術(shù)交流,可關(guān)注公眾號添加筆者微信邀請進群


          喜歡文章,點個“在看、點贊、分享”素質(zhì)三連支持一下~

          瀏覽 32
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色电影视频网址 | 天天撸免费视频 | 免费看日本一级片 | 天堂a v在线播放 | 鸡巴操美女 |