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裏的數據進行某種處理或查找,看起來像是訪問者模式和迭代器模式的混合: