我提前向你道歉,我不知道该如何使它更简洁,因为我想几乎所有这些都是相关的。对不起的!
我在用Python用Twisted设计一个游戏服务器(可能不相关,因为这是一个架构问题)。在
总的想法是,玩家连接起来,然后被安置在大厅里。然后他们可以排队等候一场比赛(例如,死亡之战或团队死亡之战),当找到一个匹配时,他们将被放入该游戏中。比赛结束后,他们被放回大厅。在
因为我知道分布式系统有多复杂,所以我尽量简化它。我的想法是把玩家的所有信息抽象成一个对象。所有的游戏逻辑都是在游戏处理程序中实现的。当玩家连接时,他们被分配到一个大厅(GameHandler)实例。当他们加入一个比赛时,他们会被重新分配到一个,比如说,Deathmatch(GameHandler)实例(保存在server:GameHandler的映射中)。在
在这一点上,当球员被添加到一个比赛,他们实际连接到的服务器作为一个反向代理(我没有写客户端,它不能修改,不能有任何连接重新协商),并发送球员的信息到比赛服务器。然后,使用实例映射,所有来自该玩家的流量都会被路由到它们所在的游戏实例中,反之亦然。我不认为这是个问题,因为服务器都应该能够在千兆局域网上转发数据。在
当游戏结束时,它只会通知转发玩家的所有大厅服务器(反向代理),然后他们返回到大厅实例。在
这意味着我可以通过添加后端服务器来扩展资源,通过添加更多反向代理大厅服务器来扩展网络链接,我还可以在任何单个节点上扩展。也没有技术限制,迫使后端服务器成为后端服务器,每个服务器都可以有一个大堂实例,但游戏可以分布在网络上。在
现在,到目前为止还不错(理论上,我还没有开始实施分配,因为我想事先确定要点),但这留下了一个主要问题:
如何控制所有节点都需要知道的元信息?在
例如:
我可以实现一个P2P解决方案,或者一个主服务器来处理这类事情。我主要担心的是,添加一个主控制服务器会增加一个单点故障(我想避免这种情况),但是P2P解决方案似乎要复杂一个数量级,并且可能会显著降低速度,或者在所有节点上使用相当数量的资源缓存数据。在
所以问题是:我的设计是否合适,您认为这两种解决元信息问题的方案的利弊是什么?有更好的第三种解决方案吗?你觉得什么最好?在
提前谢谢你,非常感谢你的帮助。在
实现共享数据库有许多解决方案。这取决于你的技术栈,网络架构,编程语言等。这是一个过于宽泛的问题,不可能在几段话中回答。选择一种方法并使用它,但要使代码模块化,以便在必要时用另一种方法代替。在
更新:根据你的评论,你正在使用Twisted,我会问你一个问题。如果您有一个Twisted服务器集群,它们都共享网络状态(您的“分布式节点”),您将如何从这些服务器请求您的“复杂操作”,以及如何获得结果?如果您能够足够详细地回答这个问题,那么您就已经确定了节点的需求。然后您可以确定它们如何共享和更新网络状态。这时,您可以问一个更具体的问题(比如“如何跨节点复制memcache?”)。在
相关问题 更多 >
编程相关推荐