【问题标题】:Java NIO or Java IO for high performance server [closed]用于高性能服务器的 Java NIO 或 Java IO [关闭]
【发布时间】:2012-10-11 02:06:25
【问题描述】:

对于我正在开发的服务器,我一直在努力在 java NIO 或旧的 java i/o 阻塞套接字之间进行选择。

我在想 java NIO 会更好,因为它会有非常多的客户端,并且客户端会保持连接,这样服务器就可以在可用时推送数据。

所以这让我觉得 java 阻塞 i/o 将是矫枉过正,因为线程的数量会很高。

对于这个案例,你有什么看法?

【问题讨论】:

  • 你试过netty吗?
  • 我会使用一个 existing 框架——不要直接使用 NIO,它是一个 PITA,很难“正确”——至少使用一个包装器,比如XNIO,尽管可能甚至更高级别的抽象都是一个开始(例如,消息框架或 Tomasz 提到的事件驱动服务器)。对我来说,NIO 的一大优势与其说是“减少线程”,不如说是“减少并发”——也就是说,通过在线程之间建立一个单一的交叉点,它需要我更少地考虑并发问题。
  • 连接数多是什么意思?每台服务器 100、1000、10000 或 100,000。您的解决方案将取决于您的确切要求。如果没有更多细节,我会假设更简单的解决方案是最好的。

标签: java sockets io nio


【解决方案1】:

如果预计将单个消息推送到客户端需要很长时间,您只会遇到阻塞 I/O 的问题。仅仅让客户端连接并不需要每个客户端一个线程。事实上,我现在正在编写这样一个软件。您只需要与在特定时间点进行的并发消息推送一样多的线程。这通常不会很高。考虑推送消息所需的时间与消息到达的等待时间之比。将并发客户端的数量乘以这个数字,就可以得到平均活动线程数。

您将维护一组所有打开的输出流,每个客户端一个。他们将只是坐在内存中,直到需要推送给客户端的消息到达。那时,您将需要一个线程来处理该消息。如果在推送消息时,您想要处理另一个事件并将消息推送到另一个客户端,您将需要第二个线程,但是一旦第一次推送完成,该线程就会返回到可用池中线程。

我还可以建议一个 Actor 模型实现来协调您的消息推送。 Actor 模型正好适合这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 2012-03-15
    相关资源
    最近更新 更多