http://www.infoq.com/cn/articles/netty-million-level-push-service-design-points/html
ChannelOption.SO_BACKLOG, 1024java
BACKLOG用于构造服务端套接字ServerSocket对象,标识当服务器请求处理线程全满时,用于临时存放已完成三次握手的请求的队列的最大长度。若是未设置或所设置的值小于1,Java将使用默认值50。算法
ChannelOption.SO_KEEPALIVE, truebootstrap
是否启用心跳保活机制。在双方TCP套接字创建链接后(即都进入ESTABLISHED状态)而且在两个小时左右上层没有任何数据传输的状况下,这套机制才会被激活。api
ChannelOption.TCP_NODELAY, true数组
在TCP/IP协议中,不管发送多少数据,老是要在数据前面加上协议头,同时,对方接收到数据,也须要发送ACK表示确认。为了尽量的利用网络带宽,TCP老是但愿尽量的发送足够大的数据。这里就涉及到一个名为Nagle的算法,该算法的目的就是为了尽量发送大块数据,避免网络中充斥着许多小数据块。服务器
TCP_NODELAY就是用于启用或关于Nagle算法。若是要求高实时性,有数据发送时就立刻发送,就将该选项设置为true关闭Nagle算法;若是要减小发送次数减小网络交互,就设置为false等累积必定大小后再发送。默认为false。网络
4.ChannelOption.SO_REUSEADDR, trueapp
SO_REUSEADDR容许启动一个监听服务器并捆绑其众所周知端口,即便之前创建的将此端口用作他们的本地端口的链接仍存在。这一般是重启监听服务器时出现,若不设置此选项,则bind时将出错。 SO_REUSEADDR容许在同一端口上启动同一服务器的多个实例,只要每一个实例捆绑一个不一样的本地IP地址便可。对于TCP,咱们根本不可能启动捆绑相同IP地址和相同端口号的多个服务器。 SO_REUSEADDR容许单个进程捆绑同一端口到多个套接口上,只要每一个捆绑指定不一样的本地IP地址便可。这通常不用于TCP服务器。 SO_REUSEADDR容许彻底重复的捆绑:当一个IP地址和端口绑定到某个套接口上时,还容许此IP地址和端口捆绑到另外一个套接口上。通常来讲,这个特性仅在支持多播的系统上才有,并且只对UDP套接口而言(TCP不支持多播)
5.ChannelOption.SO_RCVBUF AND ChannelOption.SO_SNDBUF
定义接收或者传输的系统缓冲区buf的大小,
6.ChannelOption.ALLOCATOR
Netty4使用对象池,重用缓冲区
bootstrap.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);
bootstrap.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);
http://blog.csdn.net/SpiderDog/article/category/1800249框架
ByteBuf是Netty框架里最重要的类之一,简单的说,ByteBuf就是Java.nio.ByteBuffer的Netty版。
正如类名所反映出来的,ByteBuf逻辑上就是一个byte容器。ByteBuf里的数据被两个指针划分为三个部分,以下图所示:
正是由于这样的设计,ByteBuf能够同时读写数据(只要可读区域和可写区域都还有空闲空间),而java.nio.ByteBuffer则必须调用flip()方法才能从写状态切换到读状态。
ByteBuf提供了大量的方法,比较经常使用的有下面这些:
值得一提的是,discardReadBytes()方法须要把可读数据移动到buf的开头,所以是个比较慢的操做。而clear()方法只是将两个指针清0,因此相对而言速度很快。
在Netty的世界里,ByteBuf实例一般应该由ByteBufAllocator来建立。ByteBuf和Allocator的关系以下图所示:
Allocator的buffer()方法建立ByteBuf实例,ByteBuf的alloc()方法返回建立本身的Allocator。ByteBufAllocator的实现使用了抽象工厂模式,以下图所示:
CompositeByteBuf可让咱们把多个ByteBuf当成一个大Buf来处理,ByteBufAllocator提供了compositeBuffer()工厂方法来建立CompositeByteBuf。CompositeByteBuf的实现使用了组合模式,以下图所示:
ByteBufInputStream使用适配器模式,使咱们能够把ByteBuf当作Java的InputStream来使用。同理,ByteBufOutputStream容许咱们把ByteBuf当作OutputStream来使用。
好比说咱们要实现一个自定义的消息协议,消息包括header和body两部份内容,body里放的是JSON字符串。那么就可使用ByteBufInputStream来避免把ByteBuf里的字节拷贝到字节数组的开销:
ReadOnlyByteBuf用适配器模式把一个ByteBuf变为只读,ReadOnlyByteBuf经过调用Unpooled.unmodifiableBuffer(ByteBuf)方法得到:
相似的ByteBuf适配器还包括:
前面也提到过了,咱们不多须要直接经过构造函数来建立ByteBuf实例,而是经过Allocator来建立。从装饰器模式能够看出另一种得到ByteBuf的方式是调用ByteBuf的工厂方法,好比:
最后,ByteBuf提供了4个forEachByte()方法来对ByteBuf里的数据进行某种处理或查找,看起来像是访问者模式和迭代器模式的混合: