对于我正在开发的服务器,我一直在努力在 java NIO 或旧的 java i/o 阻塞套接字之间进行选择。
我在想 java NIO 会更好,因为它会有非常多的客户端,并且客户端将保持连接,以便服务器可以在可用时推送数据。
所以这让我认为 java 阻塞 i/o 将是矫枉过正的,因为线程的数量会很高。
对于这种情况,您有什么看法?
如果预计将单个消息推送到客户端需要很长时间,您只会遇到阻塞 I/O 的问题。仅仅让客户端连接并不需要每个客户端一个线程。事实上,我现在正在编写这样一个软件。您只需要与在特定时间点进行的并发消息推送一样多的线程。这通常不会很高。考虑推送消息所需的时间与消息到达的等待时间之比。将并发客户端的数量乘以这个数字,你就得到了平均活动线程数。
您将维护一组所有打开的输出流,每个客户端一个。他们将只是坐在内存中,直到需要推送给客户端的消息到达。那时,您将需要一个线程来处理该消息。如果在推送消息时,您想要处理另一个事件并将消息推送到另一个客户端,您将需要第二个线程,但是一旦第一次推送完成,该线程就会返回到可用池中线程。
我还可以建议一个演员模型实现来协调您的消息推送。演员模型是这个问题的完全匹配。