当为每个查询执行堆和计算密集型进程且执行时间在(100ms-900ms)范围内时,在 nio 与 bio 方面的权衡有什么经验?
3 回答
真正的问题是您希望每个物理服务器能够扩展到多少并发打开连接(例如,支持服务器消息推送 ala Comet 模式 - 现在谁不想这样做?)。NIO 会让你真正进入 10,000 到 20,000 的范围。从操作系统实现的角度来看,线程是一种极其昂贵的资源(每个线程的内存消耗和上下文切换开销)。因此,使用适度的线程池可以维持数千个 NIO 连接。
使用像 MINA 这样的 NIO 框架,滚动 NIO 一点也不差。(实际上非常简单。)我推出了自己的 NIO,然后还合并了 MINA。MINA 是一个不错的选择。
http://mina.apache.org/testimonials.html
EURid 在 2006 年 4 月 7 日的 .eu 域名抢注期间使用 MINA。在最初的 4 小时内注册了超过 700.000 个域名。一小时后,MINA 处理了超过 50 万个 SSL 连接。
我们发现 MINA 的速度和稳定性非常好。虽然我们仍在使用 MINA 0.8.1,但我们发现 API 非常优雅和简单。
您应该记住的一件事是,关于 NIO 的 JVM 中的一些错误报告,这会导致 Jetty 挂起并使用 100% 的 CPU。所以,现在,如果你看到这种行为,我建议你继续使用 BIO。相关链接:
除非您发送或接收大量数据,否则 CPU 考虑因素将占主导地位。java.nio 比 java.io 更难使用(JDK 7 中的异步 I/O 介于两者之间)。如果数据量超过缓冲,那么您可能希望在不同的线程中执行 I/O。