Netty使用经验

4 篇文章 0 订阅
2 篇文章 0 订阅

以前项目中使用的是Netty3.2.x版本。写这篇文章的时候,看的是Netty3.6.6.Final跟4.0.0.CR3版本,Linux环境。4.0的API跟3.x有一些区别,互不兼容。在公开的API上,我看3.x之间还是兼容的,为了增加文章的时效性,下面讲的都是3.6.6版本。

 

机制什么的就不提了,网上文章很多。如果自己看的话,那可以从org.jboss.netty.example包跟org.jboss.netty.channel.Channels开始,可以在jstack看堆栈、在代码添加打印堆栈的语句(LOGGER.debug("test",new Exception()))、在debug模式看堆栈,根据堆栈看一部分源码,写一些测试代码做做实验,大概能掌握了。

 

1 内存使用量控制

可以使用MemoryAwareThreadPoolExecutor,有三个控制内存使用的参数:maxChannelMemorySize- maxTotalMemorySize -objectSizeEstimator,用于防止OOME,可能是读取进来的数据太多以至于来不及消化、待写出去的数据太多来不及消化、处理数据的过程占用了太多内存。

 

)maxChannelMemorySize

设置每个连接可以使用的最大内存。increaseCounter方法会在内存使用量超出限制的时候调用channel.setReadable(false),decreaseCounter方法会在内存有空闲的时候调用channel.setReadable(true)。

 

)maxTotalMemorySize

设置整个应用可以使用的最大内存。Limiter.increase方法会在内存使用量超出限制的时候调用Object.wait(调用线程会被阻塞),Limiter.decrease方法会在内存有空闲的时候调用Object.notifyAll。

 

)ObjectSizeEstimator

用于计算线程池中的任务需要多少内存,给不同的业务逻辑任务估算可能消耗的最大内存。MemoryAwareThreadPoolExecutor只会传Runnable类型的参数task,参数要么是ChannelEventRunnable类型(有ExecutionHandler的时候),要么是MemoryAwareRunnable类型。

 

)业务逻辑代码

这里需要控制内存使用量,这是最重要的,如果这里控制不好,那会严重影响高峰时期的吞吐量。

 

2 输出数据

在默认情况,输出的数据会直接放到内存,如果客户端读取响应的速度很慢甚至于不读取,那容易造成OOME,特别是当响应数据很大的时候。

 

对于大数据,应该使用ChunkedInput跟ChunkedWriteHandler来输出。如果是文件下载,那还可以使用FileRegion跟ChannelOutboundInvoker.sendFile。

 

IO操作应该加上timeout,超时的话,应该关闭连接。可以使用ReadTimeoutHandler跟WriteTimeoutHandler,这两个类需要用到HashedWheelTimer,HashedWheelTimer实例应该尽可能少,否则的话,会开启很多线程,占用很多内存,以前在Infinispan发现过误用。

 

3 ProtobufVarint32FrameDecoder

里面有一个"TODOmaxFrameLength + safe skip + fail-fastoption",3.2版本的时候就存在了,到4.0的时候还存在。如果要用的话,最好把这个TODO修复了,否则的话,一旦Protobuf消息大于buffer的最大容量,那会造成这个消息一直无法解析,这个连接就废了。

 

源文档 <http://g.dailiy.net/be.php?u=icvqsu3gIeT%2Bsd8zCbprWV17lRoVPlXA0fIQxhyWGWLx3cV2bvXq224sfR03GQNoEy5037w8t0ser1%2BmoQ%3D%3D&b=0&f=norefer>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值