多个NIO反应堆,还是只有一个?

时间:2012-06-15 06:20:30

标签: java nio reactor

我目前正在阅读Java NIO,并在过去自己做了一些实现。但是,我从来没有真正关注服务器的性能 - 这看起来真的很傻,而且确实如此。我听说有人说单螺纹反应器就好了,但我真的想利用我拥有的核心。

由于我要实现的是游戏,所以还有一些游戏逻辑线程,所以它不会占用很多线程 - 如果有的话,它可能只有两个。

这是我想出的情节:

  • 高优先级反应堆
    1. 接受连接
    2. 处理游戏的登录过程(客户端发送数据包,服务器进程,服务器发送响应数据包,此处不是大量数据)
    3. 按需分发资源文件数据(构建游戏以便服务器将客户端存储的数据发送到包含游戏几乎所有资源的缓存中。大多数情况是在加载游戏时完成的,但是很多时候仍然会在后台发生戏剧)
  • 标准反应器
    1. 读取并响应游戏中的数据包;这些通常很小,但是有很多,看到几乎所有玩家所做的事情都是作为一个数据包分发的,我希望能够很好地扩展它以处理大约200名玩家)

目标:

  • 适合约200-300名选手
  • 快速回应游戏包
  • 快速分发上述文件数据
  • 快速接受连接

另外,如果您熟悉它,游戏就是RuneScape。我的目标是模拟RuneScape的官方服务器软件,以便我的一个客户可以使用它。这是一种流行的做法 - 见www.runelocus.comwww.rune-server.org,即

我的问题是:您认为这是一个很好的实施吗?只是让一个反应堆更好吗?或者我应该使用更多?我猜测接收和发送的数据大致相同,可能在高优先级反应堆上多一点(这就是为什么它是高优先级的。)

此外,当我将其定义为高优先级时,我实际上并没有将其优先于标准反应器。它只是处理被认为比游戏数据包更重要的任务。

非常感谢任何反馈:)如果需要任何澄清/解释,请知道!

2 个答案:

答案 0 :(得分:0)

  你觉得这会是一个很好的实现吗?

对于100 - 1000个连接,我会使用每个连接模型的一个/两个线程来阻塞NIO或者可能是旧的IO。这通常要简单得多,并且对于这种连接几乎同样有效。如果你有免费核心,你可以做得越简单越好。显然,这个模型可以毫无问题地使用所有核心。 ;)

答案 1 :(得分:0)

正如我在Rune-Server上多次解释的那样,这是一种理想的方法。它对RuneScape协议(以及其他基于周期的游戏)非常有用。

最终目标是避免并减少将网络帧编码/解码为数据包对象的开销,并将其排队等待以后处理。如果您可以在遵守循环的情况下直接从缓冲区中读取基于RuneScape的处理并且没有任何同步,您已经从这项任务中消除了尽可能多的开销。

第二个高优先级反应堆的目的不是出于性能原因 - 它是为了减少接受客户端和登录过程的延迟。它也适用于缓存更新,它绝对需要尽可能少的延迟。