chr*_*tek 22 java networking nio real-time netty
我正在选择一个网络库来实现一个不能消耗任何微秒的客户端/服务器系统.它将实现自己的协议来发送和接收消息.我正在寻找一个好的NIO框架,这将允许我轻松开发服务器和客户端,而不必过多担心低级别的选择器细节.每个人都建议我使用Netty,但在向团队提交框架之前,我想尝试2或3个其他选择.我不太喜欢Netty的一件事是它如何使用自己的ByteBuf实现和引用计数来处理ByteBuffers.谁能分享你的想法和选择?
Pet*_*rey 18
这假设你真的想要节省每一微秒.大多数应用程序没有这样严格的要求.
如果要保存微秒,则需要在专用cpus上使用忙等待非阻塞NIO.这不能很好地扩展,因为您需要拥有足够的CPU,但确实可以最大限度地减少处理IO的延迟.我建议您也绑定隔离的CPU以最小化抖动.
您将希望避免使用选择器,因为它们阻止和/或创建相当多的垃圾添加到GC暂停.
另外,为了最大程度地减少延迟,您需要使用低延迟的内核旁路网络适配器,例如Solarflare.
您将需要使用推送解析器,以便在下载时解码/解析消息.即你不想等到收到整个消息才开始.
结合使用这些技巧可以为每个请求或入站事件节省10 - 30微秒.
Netty是一种更好的可扩展性解决方案,即更高的净吞吐量,但延迟成本较低,大多数基于支持Web服务的框架都可以容忍毫秒延迟.
Raf*_*ter 13
如果你可以使用至少一些Scala,Spray是Netty的绝佳替代品.从长远来看,Play框架例如打算从Netty迁移到Spray.Spray提供不同级别的TCP抽象.那些是:
您深入挖掘堆栈,传递的信息越原始.在块级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 Server后端.在Play 2.6.X版本中,播放完全迁移到Akka HTTP服务器后端.