每个客户端模型或NIO反应器模式的旧I / O线程?

我正在编写多人游戏的服务器端网络。 该游戏是一款RPG,它拥有2000名玩家的绝对最大容量,但它实际上最多可以达到300名玩家,尽管它可能更高或更低。 在最长的时间内,每次我必须在很多客户端进行网络连接时,我都坚持使用NIO,因为它不需要使用数百个线程。 最近,我遇到了一个PowerPoint演示文稿,其中详细描述了这两个模型,它几乎使得每个客户端的模型看起来优于NIO。 我还发现了一些地方,它表明老IO实际上也可以胜过NIO。

PowerPoint可以在这里找到(它有点旧): http : //www.mailinator.com/tymaPaulMultithreaded.pdf 。

我还没有写任何内容,所以如果我不得不改变整个网络设计,那么从一开始就不会有问题。 我没有时间压力。 最初,我正在使用NIO设计反应器模式实现(选择一个事件,调度一个处理事件的处理程序)。

更多信息可以在这里找到: http : //en.wikipedia.org/wiki/Reactor_pattern

我的整个reactor实现旨在使用单个线程。 由于我读到旧的IO可以超越,它实际上让我处于两难境地。 我不想设计一个复杂的NIO系统,只使用多个线程来充分利用所有的CPU能力,但我也畏惧让一个应用程序使用300多个线程的想法。 哪种设计适合我的目的? 每个客户端的线程优势在于它真正使用了所有CPUfunction本质上,但同时,它使系统陷入困境。 更不用说,单个线程的堆栈大小占用了大量内存(乘以几百倍)。 我应该坚持反应堆模式吗?

我知道这个问题有点含糊不清,但我觉得我需要专门针对我的情况问一个问题,因为我在这个网站上找不到问题,也没有找到解决我的问题的网站。 有一个关于游戏,但该游戏旨在处理成千上万的玩家。

非常感谢! 如果您需要任何澄清,请询问!

我不想设计一个复杂的NIO系统,只使用多个线程来充分利用所有的CPU能力,但我也畏惧让一个应用程序使用300多个线程的想法。 哪种设计适合我的目的?

我们的JVM连续运行500多个线程(现在它们位于~700),并且在1000秒内达到峰值。 我认为没有理由认为800线程在某种程度上“畏缩”值得。 当你达到10,000个线程(作为球场号码)时我会开始担心 – 如果你在32位以下运行,可能会更少。 当你进入1000s时,你肯定会分配更多的内存,但是1k线程以下的任何东西都不应该是个问题。 这是一个关于线程创建数字的好页面。

当您与不常见的IO建立大量连接时,NIO效率最高。 它解决了很多问题,当谈到异步通信时,你可以用NIO做的事情,“老IO”从function的角度来看不能做(例如可中断通道和非阻塞IO)但单线程处理程序是一个更简单的模型,我并不惊讶它在许多配置中可以胜过NIO实现。 使用NIO,您在Java代码中执行了大量操作,这些操作是在JVM中为您完成的,甚至是在本机代码中为您完成的。 流的多路复用和就绪IO的处理都是“免费”(就复杂性而言)使用“旧IO”模型获得的所有内容。

我会保持简单并坚持每个客户端的线程模式,直到你有充分的理由采取复杂性命中。