那么,使用 Java/Scala 原生的 Linux 来编写非阻塞 io 的设施如何? 在撰写本文时,我只是在学习/尝试编写 Http Server。因此,如果我的知识有一些基本的空白,请预先道歉。目前它都是使用流 io 用 Scala 编写的。如果我使用 native 代码进行系统调用,那么显然我必须在 native C/C++ 和我的 Scala 代码之间进行通信。我之前做过一些 JNI,而且我也有兴趣尝试在单独的进程中运行 native 代码。
但是我想强调我的问题不是关于 Scala/Java native 接口(interface),而纯粹是关于使用 native 系统调用库相对于 Scala/Java 生态系统进行 Http 服务的优势。如果使用 native ,我可以使用最新的内核。从某些方面来说这个问题是关于学习的,是把我的学习时间投入到Linux生态系统中还是Java/Scala io和非阻塞io生态系统中。我知道有一种将 TCP 分流到用户空间的举措,这可以提供有趣的可能性。
我最初关注的是 TCP/IP 服务器,这无疑是一个主要用例,但也关注其他 io,例如数据库访问。
编辑展开: java.nio 是完全异步的还是实际上在幕后使用轮询的形式?是否有可能使用 native 获得完全异步,或者您总是依赖某种形式的轮询? java.nio 是否完全使用了现代内核的异步 io 设施?我的问题也是被这篇文章激发的:Streaming video on 10 Gigabit Ethernet and beyond质疑传统套接字的使用。
最佳答案
用于 Http 服务?我想说确实没有任何优势。
网络从一开始就融入了 Java,最初设想用于机顶盒和嵌入式设备。在后续几代中,您可以通过 NIO API 全面支持非阻塞 IO。
所有这些都将委托(delegate)给您的内核提供的任何 IP 堆栈,它在前沿内核上工作得很好。
Scala 运行在 JVM 之上,并且免费获得所有这些。
可能唯一使用网络突破 native 代码的用例是如果您想使用实验性传输协议(protocol),或者使用 Windows 的第 3 方 SCTP 实现之一。这些都不适用于 HTTP + TCP。
关于Java/Scala 与 Linux 原生的非阻塞 (http) io,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33083345/