博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Netty
阅读量:6693 次
发布时间:2019-06-25

本文共 3504 字,大约阅读时间需要 11 分钟。

1、Reactor模型

    1、单线程Reactor

    2、线程池Reactor

          1、一个线程专门处理accecpt(),该线程还处理SSL握手等,因为该线程的压力很大,回是瓶颈。

     3、主从Reactor

          1、主reactor用于accept(包含SSL握手和验证,登录等)

          2、从reactor

              用于处理其他事件

2、线程模型:

    netty的handler处理是在IO线程里运行的。如果自己的业务很小,可以不在handler里面使用自己的线程池,如果自己的业务很费时间,需要使用自己的线程池进行异步处理。

3、Netty的启动,写API都是异步的。

4、 ctx.write(msg);也是异步的,内部实现可能是将bytebuffer放进netty自己的缓冲队列里,而没有提交给tcp缓冲区。

      ctx.writeAndFlush(time);

     这个方法会走到下面的代码:可以看出Netty对于NIO写的处理是只循环写16次,如果还没写完则不继续写了。使用NIO的写逻辑都应该是这样不断的循环写吧。

                                          IO写应该先在自己的缓冲区缓冲足够的数据,然后再调操作系统API写(一方面调操作系统API需要不断在内核态和用户态切换,另一方面对介质的写操作应该是一次提交大量的数据,而不是小量的                                            数据,这能提高效率)。

protected void doWrite(ChannelOutboundBuffer in) throws Exception {        for (;;) {            int size = in.size();            if (size == 0) {                // All written so clear OP_WRITE                clearOpWrite();                break;            }            long writtenBytes = 0;            boolean done = false;            boolean setOpWrite = false;            // Ensure the pending writes are made of ByteBufs only.            ByteBuffer[] nioBuffers = in.nioBuffers();            int nioBufferCnt = in.nioBufferCount();            long expectedWrittenBytes = in.nioBufferSize();            SocketChannel ch = javaChannel();            // Always us nioBuffers() to workaround data-corruption.            // See https://github.com/netty/netty/issues/2761            switch (nioBufferCnt) {                case 0:                    // We have something else beside ByteBuffers to write so fallback to normal writes.                    super.doWrite(in);                    return;                case 1:                    // Only one ByteBuf so use non-gathering write                    ByteBuffer nioBuffer = nioBuffers[0]; //因为采取的是NIO,所以一次写可能写不完。默认是循环写16次,如果还没写完,则返回。                    for (int i = config().getWriteSpinCount() - 1; i >= 0; i --) {                        final int localWrittenBytes = ch.write(nioBuffer);                        if (localWrittenBytes == 0) {                            setOpWrite = true;                            break;                        }                        expectedWrittenBytes -= localWrittenBytes;                        writtenBytes += localWrittenBytes;                        if (expectedWrittenBytes == 0) {                            done = true;                            break;                        }                    }                    break;                default:                    for (int i = config().getWriteSpinCount() - 1; i >= 0; i --) {                        final long localWrittenBytes = ch.write(nioBuffers, 0, nioBufferCnt);                        if (localWrittenBytes == 0) {                            setOpWrite = true;                            break;                        }                        expectedWrittenBytes -= localWrittenBytes;                        writtenBytes += localWrittenBytes;                        if (expectedWrittenBytes == 0) {                            done = true;                            break;                        }                    }                    break;            }            // Release the fully written buffers, and update the indexes of the partially written buffer.            in.removeBytes(writtenBytes);            if (!done) {                // Did not write all buffers completely.                incompleteWrite(setOpWrite);                break;            }        }    }

 5、netty的解码器在处理数据时可能会缓冲很多的数据,直到复合一个报文要求才会将缓冲的数据提交给下一个handler。

转载于:https://www.cnblogs.com/YDDMAX/p/5414598.html

你可能感兴趣的文章
Java - 数组排序 -- 浅析稳定性与复杂度
查看>>
bzoj3689
查看>>
Dreamweaver 制作图片热点之后,点击热点部分会有个提示框,怎么去掉
查看>>
Codeforces Round #545 (Div. 1) 简要题解
查看>>
购物商城---页面缓存oscached
查看>>
java基础--理论2
查看>>
2017.12.14工程工艺问题
查看>>
2018.6.21 HOLTEK HT49R70A-1 Source Code analysis
查看>>
服务器设计笔记(4)-----客户端通信模块
查看>>
cf595d
查看>>
IntelliJ IDEA运行eclipse的web项目报错的问题
查看>>
PHP之省事儿的封装
查看>>
洛谷3812:【模板】线性基——题解
查看>>
synchronized同步锁详解
查看>>
url参数中有+、空格、=、%、&、#等特殊符号的问题解决
查看>>
[置顶] Android 平台上蓝牙开发的关于 UUID 设置的注意事项
查看>>
Linux 安装配置 java环境 教程
查看>>
循序渐进Python3(十一) --4-- web之jQuery
查看>>
osg点选pick物体
查看>>
[03] react 测试
查看>>