那么,如何使用Linux原生的Java / Scala来编写非阻塞的io呢? 在写这篇文章的时候,我只是在学习编写一个Http服务器。 所以,如果我在我的知识上有一些基本的差距,那么就很抱歉。 它目前全部使用streamio编写在Scala中。 如果我使用本地代码进行系统调用,那么显然我必须在本机C / C ++和我的Scala代码之间进行通信。 我已经做了一些JNI,我也有兴趣尝试在单独的进程中运行本机代码。
然而,我想强调我的问题不是关于Scala / Java本地接口 ,而是纯粹的优点,如果任何使用本地系统调用库在Scala / Java生态系统的Http服务。 如果使用本机,我可以使用最新的内核。 在某些方面,这个问题是关于学习的,是把我的学习时间投入到Linux生态系统中,还是投入到Java / Scala io和非阻塞的io生态系统中。 我知道有一种将TCP分stream到用户空间的举措,可以提供有趣的可能性。
我最初专注于TCP / IP服务器,这无疑是一个主要的使用案例,但也包括其他数据库访问等。
编辑展开: java.nio是完全asynchronous的,还是实际上在后台使用了一种轮询方式? 是否有可能完全asynchronous使用本地或您总是依赖于某种forms的轮询? java.nio是否完全使用现代内核的asynchronousio工具? 我的问题也受到这篇文章的启发: 在万兆以太网上stream式传输video,并且质疑使用传统的套接字。
为Http服务? 我会说真的没有任何优势。
网络从一开始就被嵌入到Java中,最初被设想用于机顶盒和嵌入式设备。 对于后代,您可以通过NIO API完全支持非阻塞IO。
所有这一切都将委托给你的内核提供的任何IP堆栈,它在最尖端的内核上工作得很好。
Scala运行在JVM之上,并免费获取所有这些。
如果你想使用实验性的传输协议,或者使用Windows的第三方SCTP实现,可能唯一的例子就是使用网络来分析本地代码。 这些都不适用于HTTP + TCP。
这真的取决于你的项目需求。 如果你的机器资源有限,要么是因为你刚开始的时候只是有限的马力,或者是因为你会变得很大,你不想看到你的成本比你的收入快,那么编程接近硬件变得非常重要。
编程如此接近硬件的成本大大增加了开发成本。 支持这种编程水平已经取得了进展: Seastar是一个新的库,声称提供你所要求的功能。
另一方面,与Akka IO的Scala是非常高性能的。 它使您可以编写简洁的代码,清楚地完成您所需要的工作,而不会跨越边界抛出数据。
这真的归结为:在你知道实现的真正成本之前,你是在优化你的设计吗? 看到这个stackoverflow对话 。