ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Netty相关参数配置

2021-09-22 22:02:53  阅读:286  来源: 互联网

标签:Netty TIMEOUT 配置 SocketChannel 参数 设置 new 连接


一、Netty中参数的设置

  • 客户端通过Bootstrap.option设置参数,主要用于SocketChannel
  • 服务器端,分为设置服务端和客户端
    • ServerBootstrap.option 设置参数,用于SocketServerChannel
    • ServerBootstrap.childOption 设置参数,用于SocketChannel

二、CONNECT_TIMEOUT_MILLIS

  • 数据客户端参数(SocketChannel),当连接超时的时候,会派出timeout异常
  • 同SO_TIMEOUT容易搞混,SO_TIMEOUT在阻塞上使用,CONNECT_TIMEOUT_MILLIS在非阻塞上使用

设置:

package com.test.netty.c20;

import io.netty.bootstrap.Bootstrap;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelOption;

public class Test {

    public static void main(String[] args) {
        // SocketChannel 5s内未建立连接就抛出异常
        new Bootstrap().option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000);

        // ServerSocketChannel 5s内未建立连接就抛出异常
        new ServerBootstrap().option(ChannelOption.CONNECT_TIMEOUT_MILLIS,5000);
        // SocketChannel 5s内未建立连接就抛出异常
        new ServerBootstrap().childOption(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000);
    }
}

源码:

public final void connect(
                final SocketAddress remoteAddress, final SocketAddress localAddress, final ChannelPromise promise) {
    
    ...
        
    // Schedule connect timeout.
    // 设置超时时间,通过option方法传入的CONNECT_TIMEOUT_MILLIS参数进行设置
    int connectTimeoutMillis = config().getConnectTimeoutMillis();
    // 如果超时时间大于0
    if (connectTimeoutMillis > 0) {
        // 创建一个定时任务,延时connectTimeoutMillis(设置的超时时间时间)后执行
        // schedule(Runnable command, long delay, TimeUnit unit)
        connectTimeoutFuture = eventLoop().schedule(new Runnable() {
            @Override
            public void run() {
                // 判断是否建立连接,Promise进行NIO线程与主线程之间的通信
                // 如果超时,则通过tryFailure方法将异常放入Promise中
                // 在主线程中抛出
                ChannelPromise connectPromise = AbstractNioChannel.this.connectPromise;
                ConnectTimeoutException cause = new ConnectTimeoutException("connection timed out: " + remoteAddress);
                if (connectPromise != null && connectPromise.tryFailure(cause)) {
                    close(voidPromise());
                }
            }
        }, connectTimeoutMillis, TimeUnit.MILLISECONDS);
    }
    
   	...
        
}

建立一个定时任务,查看在传入时间内,是否完成连接,如果未完成连接,则通过Pormise把异常传递给主线程。

三、SO_BACKLOG

该参数是这只SocketServerChannel的。

TCP三次握手:

  • 连接队列分为2种,半连接队列和全连接队列
  • 在第一次握手完成后,连接会进入到半连接队列里面
  • 在三次握手完成后,连接会进入到全连接里面
  • accpet是在三次握手之后的事件
  • 在linux服务器中,可以设置整个服务器的这两个值的大小
    • 大小通过 /proc/sys/net/ipv4/tcp_max_syn_backlog 指定
    • 其大小通过 /proc/sys/net/core/somaxconn 指定,在使用 listen 函数时,内核会根据设置的参数和系统参数,取小的。当超过最大连接数的时候,会向客户端返回异常。

netty中的设置

// 设置全连接队列,大小为2
new ServerBootstrap().option(ChannelOption.SO_BACKLOG, 2);

查看源码可知,netty中的默认配置,都存放在 DefaultServerSocketChannelConfig 这个类中。会根据不同的操作系统,进行设置。同时在linux环境下,会读取系统配置文件。

四、TCP_NODELAY

SocketChannel的参数,因为Nagle算法的原因(也就是数据量到达一定量在发送),可能导致数据延迟发送,如果不希望延迟发送时候,该参数设置为ture

五、SO_SNDBUF & SO_RCVBUF 

设置滑动窗口大小,但是现在系统的完善,基本不会手动设置

六、ALLOCATOR

SocketChannel参数,来控制使用过的ByteBuff池化\非池化、堆内存\直接内存

设置:

new ServerBootstrap().childOption(ChannelOption.ALLOCATOR, new PooledByteBufAllocator());
// true表示使用直接内存
new PooledByteBufAllocator(true);
// false表示使用堆内存
new PooledByteBufAllocator(false);
// ture表示使用直接内存
new UnpooledByteBufAllocator(true);
// false表示使用堆内存
new UnpooledByteBufAllocator(false);

七、RCVBUF_ALLOCATOR

SocketChannel参数,用于设置接收数据得缓存大小,统一使用直接内存,是否池化则由ALLOCATOR参数控制。

以上是netty简单的一些参数描述,在具体使用过程中根据实际情况进行调试。

标签:Netty,TIMEOUT,配置,SocketChannel,参数,设置,new,连接
来源: https://blog.csdn.net/liming0025/article/details/120421711

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有