我正在选择一个网络库来实现一个不能腾出任何微秒的客户机/服务器系统。它将实现自己的协议来发送和接收消息。我正在寻找一个好的NIO框架,它将允许我轻松地开发服务器和客户端,而不必太担心低级选择器的细节。每个人都推荐我,Netty,但我想在提交给我的团队一个框架之前,尝试其他2到3个替代方案。我不太喜欢Netty的一点是,它使用自己的ByteBuf实现和引用计数来处理ByteBuffers。有没有人可以分享你的想法和选择?
发布于 2014-05-24 07:40:45
发布于 2014-05-24 07:03:56
这是假设你真的想节省每一微秒。大多数应用程序都没有这样严格的要求。
如果您想节省微秒,您将需要对专用cpus上的线程使用繁忙等待非阻塞NIO。这不能很好地扩展,因为您需要有足够的CPU,但确实最小化了处理IO的延迟。我建议您也绑定隔离的CPU以最小化抖动。
您将希望避免使用选择器,因为它们会阻塞和/或创建相当多的垃圾,从而增加GC暂停。
此外,为了最大限度地减少延迟,您需要使用低延迟、绕过内核的网络适配器,如Solarflare。
您将希望使用推式解析器,以便可以在下载消息时对其进行解码/解析。也就是说,在开始之前,你不会想要等到整个消息都收到了。
结合使用这些技巧可以将每个请求或入站事件节省10 - 30微秒。
Netty是一个更好的可伸缩性解决方案,即更高的网络吞吐量,但延迟成本很小,正如大多数基于支持web服务的框架所做的那样,这些框架可以容忍毫秒级的延迟。
发布于 2014-05-28 16:44:11
如果您至少可以使用一些Scala,那么Spray是Netty的一个很好的替代品。例如,从长远来看,Play框架打算从Netty迁移到Spray。Spray提供了不同级别的TCP抽象。它们是:
Chunk
object level
你越深入堆栈,传递的信息就越原始。在块级别API中,您非常接近原始的字节缓冲区。我自己从来没有使用过这种低抽象级别,但我听到了一些好的东西。
Spray构建在Akka IO之上,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版本中,play完全迁移到Akka HTTP server后端。
https://stackoverflow.com/questions/23839437
复制相似问题