Java/Scala 与 Linux 原生的非阻塞 (http) io

标签 java linux scala http nonblocking

那么,使用 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/

相关文章:

java - 有没有办法将 JTextArea 的插入符垂直向上移动?

java - 在没有客户端调用的网络服务中,我可以发送文件并执行一些操作吗?

java - 从 .NET 使用 Java Web 服务

linux - 在哪个本地接口(interface)上接收到连接或数据包?

linux - 脚本到包含特定单词的 sed 行

linux - 在 Linux 上提取两个字符串之间的子字符串

scala - 如何比较 Scala 函数值的相等性

scala - 突破到特定集合类型的捷径?

java - 为什么没有检测到我的参数化类类型?

scala - 在 Play 框架中代理请求