什么是用于高性能网络的Netty替代方案?

26

我正在选择一个网络库来实现一个不能浪费任何微秒的客户端/服务器系统。它将实现自己的协议以发送和接收消息。我正在寻找一个很好的NIO框架,可以让我轻松开发服务器和客户端,而不必过多关注底层选择器细节。每个人都推荐Netty,但在承诺使用框架之前,我想尝试另外两种或三种替代方案。我不太喜欢Netty处理ByteBuffers的方式,因为它使用自己的ByteBuf实现和引用计数。有人能分享一下你的想法和替代方案吗?


2
推荐问题不在话题范围内,无论是否设置悬赏。 - user207421
@EJM我刚刚达到3k,它说“此问题有一个开放的赏金,不能关闭。”它还阻止我标记... - Anubian Noob
Netty和Mina都使用自己的ByteBuffer抽象。Mina 3移除了这个抽象,但仍在进行中。Netty驱动JBOSS,这是一个更复杂的反应器框架实现。Mina更简单、更底层。 - bond
@AnubianNoob 我知道有开放悬赏的问题是不能被关闭的。这就是我发表评论的原因。 - user207421
3个回答

29
我们已经开发了一个NIO网络库,在loopback下的执行时间不到2微秒,并且不会产生任何垃圾给GC。正如Peter Lawrey所提到的,JDK本地选择器会产生大量的垃圾,但是我们通过实现自己的epoll选择器来解决了所有这些垃圾泄漏问题。忙等待选择器线程对于延迟非常好,但必须保持平衡,以免烧毁芯片或消耗大量能量。我们的选择器实现使用低级技巧来实现一种节能模式,以达到这种平衡。
除了CoralReactor,您还可以看看GrizzlyMina,但我们尚未使用这些框架。
有关一些Netty TCP性能基准,请参见此处

我对此很感兴趣;然而,原生JDK每30多万个请求只会产生约150 MB的垃圾。以118 MB/s的速度,大约每2分钟就会产生一次。我想看看与Netty相比,使用JDK NIO的基准测试结果。 - bond
JDK NIO中唯一会产生垃圾的部分与ArrayList/List机制有关,它在将选择事件从Selector移动时存储。这些垃圾量相对较少。Netty和Mina在此基础上添加了大量垃圾。JDK NIO还使用synchronized关键字进行了一堆可怕的操作,但这是另一个讨论话题。我完全支持比JDK版本更好的NIO;我只想看到NIO本身的数字。 - bond
33
非免费、非开源,没有明确的许可证。 - Norswap
基准测试应该使用一个唯一的客户端。 - Amir Fo

23

假设您确实想要节省每一微秒。大多数应用程序没有如此严格的要求。

如果您想要节省微秒,您将需要使用繁忙等待非阻塞NIO线程在专用CPU上。这不会很好地扩展,因为您需要拥有大量的CPU,但可以最小化处理IO的延迟。我建议您还绑定孤立的CPU以最小化抖动。

您将希望避免使用选择器,因为它们会阻塞和/或创建相当多的垃圾,从而增加了GC暂停时间。

此外,为了最小化延迟,您将希望使用低延迟、内核旁路网络适配器,例如Solarflare。

您将需要使用推送解析器,以便可以在下载时解码/解析长消息。也就是说,在开始之前,您不想等待整个消息的接收。

将这些技巧组合使用可以使每个请求或传入事件的延迟减少10-30微秒。

Netty是可伸缩性更好的解决方案,即更高的净吞吐量,但代价是小幅度延迟,大多数基于支持Web服务的框架也都是如此,延迟在毫秒级别是可以容忍的。


15
如果您能够接受至少一些Scala的话,Spray是Netty的一个很好的替代品。长远来看,例如Play框架打算从Netty迁移到Spray。Spray提供不同级别的TCP抽象,它们是:
  1. 块级别
  2. 请求级别(HttpRequest / HttpResponse)
  3. 编组对象级别
您越深入堆栈,交付信息就越原始。在块级别API中,您可以接近原始字节缓冲区。我自己从未使用过这种低层抽象级别,但听说效果很好。
Spray建立在Akka IO之上,后者又建立在Java NIO之上。所有功能都围绕Actor抽象进行包装,这使得使用Spray构建并行应用程序变得容易。我认为聊天服务器是一个完美的应用案例。由于Akka提供了Java API,您应该能够主要使用此API来使用Spray。但是,您可能需要不时阅读一些Scala源代码。最终,Spray将完全合并到Akka中。
编辑:引用Spray网站的话:“Spray不再维护,已被Akka HTTP取代。Playframework从Play 2.4.X开始实验性地支持Akka HTTP服务器后端。在Play 2.6.X版本中,play完全迁移到了Akka HTTP服务器后端。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接