每个连接的线程与一个线程,用于java中的所有连接

时间:2017-12-29 07:24:08

标签: java sockets nio nonblocking socketchannel

我目前有两种不同类型的服务器和客户端正在工作,我正在尝试确定哪种服务器更适合MMO服务器,或者至少是一台小型MMO服务器,一次至少有100名服务器。

我的第一台服务器使用每个连接模型的线程,并使用ObjectOutputStream通过套接字发送对象。

我的第二台服务器正在使用java nio只为所有连接使用一个线程,并使用select循环它们。此服务器也使用ObjectOutputStream发送数据

对于我的问题,对于MMO服务器更好的方法是什么?如果单线程模型更好,如何通过套接字通道发送对象会受到影响,是不是一直读取而不是完整的对象

通过它发送的每个对象只包含例如一个int和2个浮点数,用于发送位置和玩家ID。

1 个答案:

答案 0 :(得分:2)

我将把这个问题与MMO使用UDP over TCP的原因联系起来。原因是UDP承诺快速交付,而TCP承诺保证交付。

类似的类比可以应用于单线程和多线程模型。无论您选择哪种模式,您的整体CPU周期都保持不变,即服务器每秒只能处理如此多的信息。 让我们看看每个场景中会发生什么

1. 单线程模型: 在这种情况下,您自己的实现或底层库将最终创建一个请求开始排队的管道。如果您处于最小负载状态,则队列将保持几乎为空并且执行将是实时的,但是可能会浪费大量CPU。在最大负载时,将会有一个长队列,并且执行将随着负载的增加而产生延迟,但是会保证交付并且CPU利用率将是最佳的。通常情况下,慢速客户端会降低其他人的速度。

  1. 多线程模型: 在这种情况下,根据您自己的实现或底层库如何实现多线程,请求的并行执行将开始发生。对MT来说,很容易被愚弄。例如,除非将队列大小设置为较低的值,否则java.util.concurrent.ThreadPoolExecutor实际上不会执行任何并行处理。一旦并行处理开始发生,在最小负载下,您的执行将是超快的,并且CPU利用率将是最佳的并且游戏性能将是巨大的。但是,在最大负载下,RAM使用率会很高,CPU利用率仍然是最佳的。通常,您需要放置线程中断以避免慢速客户端占用所有线程,这将意味着慢速客户端的性能不佳。此外,当您开始耗尽线程池和资源时,线程将排队或者被丢弃导致性能不佳。
  2. 在游戏中,性能比稳定性更重要,因此毫无疑问你应该在任何地方使用MT,但是调整你的线程参数以补充你的服务器资源将决定它是一个恩惠还是一个完整的祸害