netty实战之ChannelOption配置

原创 2017年08月29日 19:23:05

服务端ServerBootstrap之ChannelOption配置


public static void main(String[] args) throws InterruptedException {
        EventLoopGroup parentGroup = new NioEventLoopGroup();
        EventLoopGroup childGroup = new NioEventLoopGroup();

        ServerBootstrap serverBootstrap = new ServerBootstrap();
        serverBootstrap.group(parentGroup, childGroup);

        serverBootstrap.option(ChannelOption.SO_REUSEADDR,true);

        serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true)
        serverBootstrap.childOption(ChannelOption.TCP_NODELAY, true);

    }

SO_REUSEADDR=true

设置SO_REUSEADDR为true,意味着地址可以复用,比如如下场景

某个进程占用了80端口,然后重启进程,原来的socket1处于TIME-WAIT状态,进程启动后,使用一个新的socket2,要占用80端口,如果这个时候不设置SO_REUSEADDR=true,那么启动的过程中会报端口已被占用的异常。

注意,这个SO_REUSEADDR是使用serverBootstrap的option方法来设置,而不是使用childOption方法来设置,要知道具体原因,可以先看李林峰关于netty线程模式

Netty系列之Netty线程模型

简单来说就是option操作是针对parentGroup的,而childOption是针对childGroup的。


SO_KEEPALIVE=true

SO_KEEPALIVE=true,是利用TCP的SO_KEEPALIVE属性,当SO_KEEPALIVE=true的时候,服务端可以探测客户端的连接是否还存活着,如果客户端因为断电或者网络问题或者客户端挂掉了等,那么服务端的连接可以关闭掉,释放资源。


TCP_NODELAY=true


如果TCP_NODELAY没有设置为true,那么底层的TCP为了能减少交互次数,会将网络数据积累到一定的数量后,服务器端才发送出去,会造成一定的延迟。在互联网应用中,通常希望服务是低延迟的,建议将TCP_NODELAY设置为true。


客户端Bootstrap之ChannelOption配置


public static void main(String[] args) throws InterruptedException {
        EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
        Bootstrap bootstrap = new Bootstrap();
        bootstrap.group(eventLoopGroup);

        bootstrap.option(ChannelOption.SO_KEEPALIVE, Boolean.TRUE)
                 .option(ChannelOption.TCP_NODELAY, Boolean.TRUE)
                 .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000);
    }

客户端的netty代码,一般就使用一个EventLoopGroup就可以了,所以这里用option方法来设置属性。
SO_KEEPALIVE和TCP_NODELAY的含义跟上面服务端代码是一样的。

通常客户端代码中还会设置一个CONNECT_TIMEOUT_MILLIS,表示客户端调用服务端接口的超时时间。这个设置可以当做一个默认设置,我们在应用层,服务端接口一定要能支持设置超时时间,因为不同的业务服务接口,针对不同场景,超时时间可能是不同的。

上面这些netty中关于ChannelOption属性设置,已经在线上用了三年了,并且经过了大流量的验证,暂时还没发现问题。

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

Dojo -- Modules篇之AMD介绍

为了使得代码更加容易维护和调试,dojo 引入了AMD。本文介绍AMD的一些基本用法。如何加载Dojo模块为了更好的理解Dojo的模块,在这里先写个例子,说明一下Dojo如何加载模块的。至于什么是模块...

netty实战之百万级流量NioEventLoopGroup线程数配置

编写netty服务端程序的时候,会使用到两个线程组 EventLoopGroup parentGroup = new NioEventLoopGroup(); EventLoopGrou...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

linux 如何启动与关闭 有依赖的 jar

第一步:把你项目下的文件 导进服务器,如 config lib 等,第三方依赖包放在lib 下 使用 工具如 eclipse 打成jar 包(只选择src 目录下 源码),不是 runabl...

netty学习十三:零拷贝底层实现原理

零拷贝概述零拷贝可以避免无谓的copy动作,为了说清楚这一点,本文会先从传统的读写操作开始介绍。传统读操作当应用发起一个从磁盘读取文件的操作时,请求会先经过内核,由内核与磁盘进行交互。数据会从磁盘拷贝...

Dojo -- Getting Started篇之Hello Dojo!

一直都想尝试使用dojo,毕竟它是众多JavaScript高手眼中的”瑰宝”。本文是dojo系列的第一篇,会介绍一下dojo的搭建和编写两个简单的hello word程序。   下载dojo 在网络通...

Dojo -- Getting Started篇之Modern Dojo(现代化Dojo)

“modern”dojo 本文会介绍一下,dojo1.10带来的新的变化。 准备开始 Dojo1.7是一个重要里程碑,整体的架构更加灵活,也更加“现代化”。Dojo1.10则在1.7的基础上,引...

netty学习一:用netty构造http服务的小demo

概述netty可以支持http、socket、websocket,本文会做一个小demo,简单介绍一下如何用netty搭建一个http服务。netty虽然可以提供http服务,但是相比spring m...

netty学习十一:NIO客户端服务端通讯demo

netty学习十一:NIO客户端服务端通讯demo

netty demo学习文章汇总

概述到目前为止,关于netty学习的文章一共写了13篇,里面没有介绍netty实战也没有介绍netty源码分析,都是一些小demo的演示,算是作为netty学习的入门篇章。接下来会开始编写关于nett...

SQL语句 select case when (转)

CASE 可能是 SQL 中被误用最多的关键字之一。虽然你可能以前用过这个关键字来创建字段,但是它还具有更多用法。例如,你可以在 WHERE 子句中使用 CASE。 首先让我们看一下 CASE 的语法...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)