如何在水平缩放的游戏服务器中管理元信息?

2024-05-14 06:24:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我提前向你道歉,我不知道该如何使它更简洁,因为我想几乎所有这些都是相关的。对不起的!

我在用Python用Twisted设计一个游戏服务器(可能不相关,因为这是一个架构问题)。在

总的想法是,玩家连接起来,然后被安置在大厅里。然后他们可以排队等候一场比赛(例如,死亡之战或团队死亡之战),当找到一个匹配时,他们将被放入该游戏中。比赛结束后,他们被放回大厅。在

因为我知道分布式系统有多复杂,所以我尽量简化它。我的想法是把玩家的所有信息抽象成一个对象。所有的游戏逻辑都是在游戏处理程序中实现的。当玩家连接时,他们被分配到一个大厅(GameHandler)实例。当他们加入一个比赛时,他们会被重新分配到一个,比如说,Deathmatch(GameHandler)实例(保存在server:GameHandler的映射中)。在

在这一点上,当球员被添加到一个比赛,他们实际连接到的服务器作为一个反向代理(我没有写客户端,它不能修改,不能有任何连接重新协商),并发送球员的信息到比赛服务器。然后,使用实例映射,所有来自该玩家的流量都会被路由到它们所在的游戏实例中,反之亦然。我不认为这是个问题,因为服务器都应该能够在千兆局域网上转发数据。在

当游戏结束时,它只会通知转发玩家的所有大厅服务器(反向代理),然后他们返回到大厅实例。在

这意味着我可以通过添加后端服务器来扩展资源,通过添加更多反向代理大厅服务器来扩展网络链接,我还可以在任何单个节点上扩展。也没有技术限制,迫使后端服务器成为后端服务器,每个服务器都可以有一个大堂实例,但游戏可以分布在网络上。在

现在,到目前为止还不错(理论上,我还没有开始实施分配,因为我想事先确定要点),但这留下了一个主要问题:

如何控制所有节点都需要知道的元信息?在

例如:

  • 在客户端连接之前,有多少玩家在线等待服务器列表显示?在
  • matchmaking是以某种P2P方式实现的(如果这很重要的话,我打算使用微软的TrueSkill算法),还是应该为此委派整个服务器(甚至是元信息)?在
  • 玩家一起排队的聚会系统怎么样?哪个服务器跟踪组中的玩家?在
  • 我如何管理配置,像被禁玩家?每个转发服务器都需要知道它们。在
  • 如果玩家连接到的大堂实例恰好已满,如何找到另一个未满的大堂实例,以便将它们的连接路由到那里?这要回到第一点,我需要一种方法让节点能够轻松地查询网络状态

我可以实现一个P2P解决方案,或者一个主服务器来处理这类事情。我主要担心的是,添加一个主控制服务器会增加一个单点故障(我想避免这种情况),但是P2P解决方案似乎要复杂一个数量级,并且可能会显著降低速度,或者在所有节点上使用相当数量的资源缓存数据。在

所以问题是:我的设计是否合适,您认为这两种解决元信息问题的方案的利弊是什么?有更好的第三种解决方案吗?你觉得什么最好?在

提前谢谢你,非常感谢你的帮助。在


Tags: 实例网络服务器信息游戏代理节点玩家
1条回答
网友
1楼 · 发布于 2024-05-14 06:24:43

实现共享数据库有许多解决方案。这取决于你的技术栈,网络架构,编程语言等。这是一个过于宽泛的问题,不可能在几段话中回答。选择一种方法并使用它,但要使代码模块化,以便在必要时用另一种方法代替。在

更新:根据你的评论,你正在使用Twisted,我会问你一个问题。如果您有一个Twisted服务器集群,它们都共享网络状态(您的“分布式节点”),您将如何从这些服务器请求您的“复杂操作”,以及如何获得结果?如果您能够足够详细地回答这个问题,那么您就已经确定了节点的需求。然后您可以确定它们如何共享和更新网络状态。这时,您可以问一个更具体的问题(比如“如何跨节点复制memcache?”)。在

相关问题 更多 >