【问题标题】:Is this a good multi-threaded server design?这是一个好的多线程服务器设计吗?
【发布时间】:2011-04-13 23:16:21
【问题描述】:

我有一个用于客户端-服务器游戏的服务器(理想情况下是小型 MMO 的基础),我正在尝试确定组织所有内容的最佳方式。以下是我所拥有的概述:

[server start]
load/create game state
start game loop on new thread
start listening for udp packets on new thread
while not closing
  listen for new tcp connection
    create new tcp client
    start clients tcp listener on new thread
save game state
exit

[game loop]
  sleep n milliseconds // Should I sleep here or not?
  update game state
  send relevant udp packet updates to client
  every second
    remove timed out clients

[listen for udp]
  on receive, send to correct tcp client to process

[listen for tcp] (1 for each client)
  manage tcp packets

对于管理游戏状态、tcp 连接和发送/接收 udp 数据包以进行状态更新,这是一个公平的设计吗?有什么问题或问题吗?

我最感兴趣的是进行游戏循环的最佳方式。我知道如果我有大量客户端,我会遇到问题,因为我会为每个新客户端生成一个新线程。

【问题讨论】:

  • many user是多少?
  • 我没有设置限制,但目前没有人使用它。我想拥有的是可扩展的。我知道为超过 10 个客户端的每个客户端生成一个线程会很糟糕。

标签: java multithreading networking client-server


【解决方案1】:

这看起来是一个合理的设计开始。就扩展线程数量而言,超过 10 个客户端(根据您的评论)也不错。只要线程主要在等待而不是实际处理某些东西,您就可以在事情开始崩溃之前轻松拥有数千个线程。我记得 5 年前类似的设计遇到了一些限制,大约是 7000 个线程。

【讨论】:

  • 客户端线程的发布只会在调用接收 TCP 数据包时被阻塞。
  • 是的,那你很好。在您处理数千个客户端或希望在资源有限的设备上运行服务器之前,我不会担心线程过多。
  • 记得减少线程的堆栈大小。将帮助您处理更多线程。
【解决方案2】:

看起来不错的设计。如果我是你,我会使用现有的 nio 框架,例如 netty

只需 google java nio frameworks,您就会发现几个带有示例和文档的框架。

更新

谢谢,但我更喜欢自己做。这只是我的一个副项目,它的大部分目的是

恕我直言,通过使用现有框架并专注于游戏设计,您将学到更多知识,而不是从一开始就自己做所有事情。

下一次你会知道如何设计游戏,这也使得设计 IO 框架变得更容易。

【讨论】:

  • 谢谢,但我更喜欢自己做。这只是我的一个业余项目,它的大部分目的是学习。
  • 网络部分是这个项目的重点。我现在才真正把它变成一个游戏,我正在尝试优化我已经存在的网络部分。
【解决方案3】:

我想说的是(尤其是)在 Java 中,线程更多是为了方便而不是为了性能(只有太多的内核,我猜你想控制哪些线程具有优先级) .

您没有提及消息交换量和客户端数量,但您可能希望从单线程处理网络 IO 的角度考虑更自然,并让它以紧凑的方式调度传入的请求循环,并将实际工作(即您无法在紧密循环中处理的请求)映射到线程池。 IIRC,在这种设置中,限制因素将是您可以在单个线程中同时等待输入的最大 TCP 连接数。

为了增加乐趣,将其与具有更多轻量级线程的语言的解决方案进行比较,例如在 Erlang 中。

当然,正如@WhiteFang34 所说,在您对代码进行一些认真的模拟/使用之前,您不需要这样的解决方案。相关技术(以及可以从中找到灵感的 Netty 等框架)也可以在 this question here 中找到。

创建线程是有一定成本的,mostly the per-thread stack

【讨论】:

  • 目前,TCP 连接将仅用于访问管理和可能发送/请求聊天文本,因为我想保证所有这些消息都会发送/接收给需要它们的每个人。 UDP 数据包将不断发送/接收以进行状态更新。
  • @gamernb:如果添加了讨论每线程成本的链接。
  • @ShiDoiShi 我阅读了您提供的链接,但我认为它不适用。我不是为每个请求创建一个新线程,而是为每个 TCP 客户端创建一个新线程。然后该线程将处理来自该客户端的所有请求。我知道有开销,但我相信如果暂时可以接受的话。
猜你喜欢
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
  • 2011-04-07
  • 2010-09-17
  • 1970-01-01
相关资源
最近更新 更多