成都网站建设设计

将想法与焦点和您一起共享

Netty每次读取客户端数量有多少

这篇文章将为大家详细讲解有关Netty每次读取客户端数量有多少,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

公司主营业务:成都做网站、成都网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。成都创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。成都创新互联公司推出昭化免费做网站回馈大家。

当许多客户端同时连接服务端时, Netty默认每次读取多少连接呢? 接下来我们 就结合源码和实战分析下.  
之前我们讲到NioEventLoop在进行三部曲之后(创建-启动-执行), 就会一直无限循环在执行过程. 而执行过程又分为三个步骤(轮询IO事件-处理IO事件-执行队列任务). 那么在轮询到有IO事件, 准确说当有客户端连接的事件时, 接下来就是处理IO事件, 也就是在处理IO事件的过程中, 读取客户端连接, 那么每次读取多少个呢?
说明一点, 我们使用的Netty版本如下. 因为不同的版本(尤其是最新的版本)会有差异.
      io.netty      netty-all      4.1.5.Final

当服务端一直循环在以下代码时  
io.netty.channel.nio.NioEventLoop#run
它会监听客户端请求. 我们假如此时通过telnet 127.0.0.1 8080连接到服务器共19个客户端.  
服务器监听到ACCEPT事件后, 便会处理这些事件.   
io.netty.channel.nio.NioEventLoop#processSelectedKeys
进而调用到如下主要代码  
io.netty.channel.nio.AbstractNioMessageChannel.NioMessageUnsafe#read
此方法内会有一个循环
do {    int localRead = doReadMessages(readBuf);    if (localRead == 0) {        break;    }    if (localRead < 0) {        closed = true;        break;    }    allocHandle.incMessagesRead(localRead);} while (allocHandle.continueReading());
我们通过debug方式调试. 为了模拟实现并发同时有19个客户端到达, 我们先在轮询IO事件地方打个断点, 让服务端线程'停止'. 当我们通过telnet执行了19个命令后再'放行'服务端线程.  

Netty每次读取客户端数量有多少

断点打好之后, 我们便通过telnet 连接到服务器, 共连接19次.
连接好之后, 我们'放行'服务端线程.
我们在上面说的代码中打个断点

Netty每次读取客户端数量有多少

此时还没有读取客户端连接, 目前size = 0  
当我们继续'放行'  

Netty每次读取客户端数量有多少

可以看到size = 16  
我们先继续'放行', 最后分析  
服务器处理完上一波之后, 会再次轮询IO事件, 结果又轮询到ACCEPT事件, 继续处理IO事件. 这一次的size = 3  

Netty每次读取客户端数量有多少

第一次size = 16 第二次size = 3 两个加起来正好等于我们的客户端连接数19. 于是我们猜测, 服务器每次读取客户端连接数是16. 虽然客户端同一时刻有19个客户端连接到服务器, 服务器也监听轮询到有客户端连接请求, 于是服务器在第一次循环过程只读取16个客户端. 剩下的3个客户端等到第二次轮询的时候再读取. 我们进入
allocHandle.continueReading()
查询一下.  
io.netty.channel.DefaultMaxMessagesRecvByteBufAllocator.MaxMessageHandle#continueReading
public boolean continueReading() {    return config.isAutoRead() &&           attemptedBytesRead == lastBytesRead &&           totalMessages < maxMessagePerRead &&           totalBytesRead < Integer.MAX_VALUE;}
我们可以看到有个  maxMessagePerRead属性, 它就是控制每次读取客户端数量.   我们  通过debug追踪下这个值  . 我们在如下代码中打个断点.
io.netty.channel.DefaultMaxMessagesRecvByteBufAllocator#maxMessagesPerRead(int)

Netty每次读取客户端数量有多少

重启服务器

Netty每次读取客户端数量有多少

我们发现它最后被赋值16, 我们通过堆栈可以追踪到它的来源.  

Netty每次读取客户端数量有多少

最后我们发现, 在创建NioServerSocketChannel的时候, 同时创建config(每个Channel对应一个Config). 每个Config对应一个RecvByteBufAllocator. 而maxMessagesPerRead属性属于  RecvByteBufAllocator类. 而那个具体的16是在哪里呢?

Netty每次读取客户端数量有多少

Netty每次读取客户端数量有多少

每个Channel都有meta  

Netty每次读取客户端数量有多少

源码中可知, 将这个16赋值给了  RecvByteBufAllocator的  maxMessagesPerRead属性.
结论: 服务端每次读取16个客户端请求

关于“Netty每次读取客户端数量有多少”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。


分享标题:Netty每次读取客户端数量有多少
URL链接:http://chengdu.cdxwcx.cn/article/pedics.html