关闭

Netty高可靠性设计:优化建议

1801人阅读 评论(0) 收藏 举报
分类:

尽管Netty的可靠性已经做得非常出色,但是在生产实践中还是发现了一些待优化点,本小节将进行简单说明。希望后续的版本中可以解决,当然用户也可以根据自己的实际需要决定自行优化。

1  发送队列容量上限控制

Netty的NIO消息发送队列ChannelOutboundBuffer并没有容量上限控制,它会随着消息的积压自动扩展,直到达到0x7fffffff。

如果网络对方处理速度比较慢,导致TCP滑窗长时间为0;或者消息发送方发送速度过快,或者一次批量发送消息量过大,都可能会导致ChannelOutboundBuffer的内存膨胀,这可能会导致系统的内存溢出。

建议优化方式如下:在启动客户端或者服务端的时候,通过启动项的ChannelOption设置发送队列的长度,或者通过-D启动参数配置该长度。

2  回推发送失败的消息

当网络发生故障的时候,Netty会关闭链路,然后循环释放待未发送的消息,最后通知监听listener。

这样的处理策略值得商榷,对于大多数用户而言,并不关心底层的网络I/O异常,他们希望链路恢复之后可以自动将尚未发送的消息重新发送给对方,而不是简单的销毁。

Netty销毁尚未发送的消息,用户可以通过监听器来得到消息发送异常通知,但是却无法获取原始待发送的消息。如果要实现重发,需要自己缓存消息,如果发送成功,自己删除,如果发送失败,重新发送。这对于大多数用户而言,非常麻烦,用户在开发业务代码的同时,还需要考虑网络I/O层的异常并为之做特殊的业务逻辑处理。

下面我们看下Mina的实现,当发生链路异常之后,Mina会将尚未发送的整包消息队列封装到异常对象中,然后推送给用户Handler,由用户来决定后续的处理策略。相比于Netty的“野蛮”销毁策略,Mina的策略更灵活和合理,由用户自己决定发送失败消息的后续处理策略。

大多数场景下,业务用户会使用RPC框架,他们通常不需要直接针对Netty编程,如果Netty提供了发送失败消息的回推功能,RPC框架就可以进行封装,提供不同的策略给业务用户使用,例如:

1.缓存重发策略:当链路发生异常之后,尚未发送成功的消息自动缓存,待链路恢复正常之后重发失败的消息;

2.失败删除策略:当链路发生异常之后,尚未发送成功的消息自动销毁,它可能是非重要消息,例如日志消息,也可能是由业务直接监听异常并做特殊处理;

3.其他策略.......

0
0
查看评论

Netty中队列(部分)的处理机制

Netty中队列(部分)的处理机制  概述 本意是探究netty框架中的队列实现机制,为以后的大数据量并发做前期准备,或者可通过修改其队列实现机制来增大netty框架的并发量,以满足项目需求,然而,netty框架中的队列并未放置在单独的一个包中处理,有针对具体情况做的具体分析,此文档只...
  • linfenliang
  • linfenliang
  • 2014-09-18 16:28
  • 1795

Netty 缓存buffer介绍及使用

每当你需要传输数据时,它必须包含一个缓冲区。Java NIO API 自带的缓冲区类是相当有限的,没有经过优化,使用 JDK 的 ByteBuffer 操作更复杂。缓冲区是一个重要的组建,它是 API 的一部分。Netty提供了一个强大的缓冲区实现用于表示一个字节序列,并帮助你操作原始字节或自定义的...
  • cuiyaoqiang
  • cuiyaoqiang
  • 2016-06-13 10:19
  • 8171

解读Netty之接收缓冲区

概述用过netty,大家都知道在请求处理之前,会有一个缓冲区用于接受数据,不同场景对缓冲的大小都不太一样。 比如UDP协议的DatagramChannel,默认缓冲区大小只给了2048,而假如开发一个SyslogUdp的协议服务,大小其实就不止这么点。因此,缓冲区怎么用,怎么设置就非常关键啦,很不...
  • zs_Scofield
  • zs_Scofield
  • 2017-02-22 15:41
  • 4185

Netty缓冲区动态扩容

**Netty简述** netty 是 java的一个io框架, 它简化了nio编程,提高了io的性能和可靠性,是服务端常用的框架之一,在大数据系统中也是很常见的一个框架。 官方说明中,netty 主要提供了创建私有协议的解决方案。 **缓冲区** io 编程中少不了对缓...
  • fanglaolaoda
  • fanglaolaoda
  • 2015-12-29 09:45
  • 1322

基于netty的企业即时通讯系统的设计与实-服务器消息重发

服务器把消息发送出去,服务器记录这条消息的状态,客户端如果收到这条消息,向服务器发送一个回执,服务器收到这个回执将状态修改成已经收到,如果一定时间没有收到回执,则再次发送这条消息。
  • calmkey
  • calmkey
  • 2016-03-30 10:09
  • 1874

[netty核心类]--缓冲区ByteBuf

本文主要包括以下内容: 1)ByteBuf的三种类型:heapBuffer(堆缓冲区)、directBuffer(直接缓冲区)以及Composite Buffer(复合缓冲区)。 2)ByteBuf的工作原理。 3)ByteBuf与JDK中ByteBuffer的区别以及对比...
  • u010853261
  • u010853261
  • 2016-12-16 14:24
  • 7804

用Netty开发中间件:高并发性能优化

用Netty开发中间件:高并发性能优化最近在写一个后台中间件的原型,主要是做消息的分发和透传。因为要用Java实现,所以网络通信框架的第一选择当然就是Netty了,使用的是Netty 4版本。Netty果然效率很高,不用做太多努力就能达到一个比较高的tps。但使用过程中也碰到了一些问题,个人觉得都是...
  • dc_726
  • dc_726
  • 2015-10-08 20:52
  • 49958

Netty调优

Netty百万级推送服务设计要点:http://www.infoq.com/cn/articles/netty-million-level-push-service-design-points/ Netty服务端优化 在高并发场景下,服务端EventLoopGroup处理注册事件...
  • yixiao3660
  • yixiao3660
  • 2016-06-28 10:34
  • 2953

netty高性能原因,netty调优

netty高性能原因,netty调优
  • zhaozhenzuo
  • zhaozhenzuo
  • 2017-05-17 04:36
  • 2333

用Netty开发中间件:高并发性能优化

原文地址:http://blog.csdn.net/dc_726/article/details/48978891 用Netty开发中间件:高并发性能优化 最近在写一个后台中间件的原型,主要是做消息的分发和透传。因为要用Java实现,所以网络通信框架的第一选择当然就是Netty了,使用的是Net...
  • tanga842428
  • tanga842428
  • 2016-10-23 11:24
  • 1981
    个人资料
    • 访问:3921907次
    • 积分:56482
    • 等级:
    • 排名:第57名
    • 原创:1462篇
    • 转载:83篇
    • 译文:1篇
    • 评论:3786条
    博客专栏
    文章存档
    最新评论