Architecture 对于需要相互通信的多个游戏服务器,最佳的体系结构是什么?

Architecture 对于需要相互通信的多个游戏服务器,最佳的体系结构是什么?,architecture,cloud,distributed-computing,Architecture,Cloud,Distributed Computing,该游戏是一个低图形(SVG)战略游戏。 每个服务器代表一个游戏域及其玩家。 所有服务器都应该能够相互通信,因为玩家可以(在游戏中)从一个域移动到另一个域/发送“外交信使”等 我们之所以选择这个想法,是因为它使我们能够无限地扩大世界地图,它使第二方能够将他们的游戏服务器连接到我们身上,而这些服务器将使世界变得更加广阔。如果一台服务器(及其备份)出现故障,游戏仍将继续运行(真正的分布式环境) 我们才刚刚开始。我们应该看看哪些平台可以帮助我们发展这样一个世界?XMPP,以前称为Jabber,可能是一个

该游戏是一个低图形(SVG)战略游戏。 每个服务器代表一个游戏域及其玩家。 所有服务器都应该能够相互通信,因为玩家可以(在游戏中)从一个域移动到另一个域/发送“外交信使”等

我们之所以选择这个想法,是因为它使我们能够无限地扩大世界地图,它使第二方能够将他们的游戏服务器连接到我们身上,而这些服务器将使世界变得更加广阔。如果一台服务器(及其备份)出现故障,游戏仍将继续运行(真正的分布式环境)


我们才刚刚开始。我们应该看看哪些平台可以帮助我们发展这样一个世界?

XMPP,以前称为Jabber,可能是一个很好的起点

XMPP,以前称为Jabber,可能是一个很好的起点 < P>我认真考虑Erlang和CoucDB,或者在谷歌AppEngine下实现它。

< P>如果它是真正分布的,那么我猜没有中央服务器的计划。这意味着您真正需要的是各种服务器之间的通信机制。REST和XML-RPC都是非常简单的机制,使服务器能够相互通信,以传达用户需要从一个移动到另一个

正如Daniel所说,你也可以使用类似XMPP的东西,但这意味着你必须将另一套服务器软件与运行游戏本身的任何东西(我从你的描述中猜测,这可能是某种web应用服务器)连接在一起

从开发的角度来看,任何用于开发web应用程序的强大语言/框架都应该有效。Ruby-on-Rails、Python-on-Django、许多框架加上Java,甚至Cake-w/PHP(ick)都可以用于开发工作


我过去也曾考虑过类似的问题,但审查各种服务器(即如何处理损坏或恶意的服务器,让玩家同时将同一块移动到两个或三个其他服务器上),处理退出的服务器(最后存在的玩家会发生什么情况),等等。看起来很有挑战性。

如果它是真正的分布式的,那么我猜没有中央服务器的计划。这意味着您真正需要的是各种服务器之间的通信机制。REST和XML-RPC都是非常简单的机制,使服务器能够相互通信,以传达用户需要从一个移动到另一个

正如Daniel所说,你也可以使用类似XMPP的东西,但这意味着你必须将另一套服务器软件与运行游戏本身的任何东西(我从你的描述中猜测,这可能是某种web应用服务器)连接在一起

从开发的角度来看,任何用于开发web应用程序的强大语言/框架都应该有效。Ruby-on-Rails、Python-on-Django、许多框架加上Java,甚至Cake-w/PHP(ick)都可以用于开发工作


我过去也曾考虑过类似的问题,但审查各种服务器(即如何处理损坏或恶意的服务器,让玩家同时将同一块移动到两个或三个其他服务器上),处理退出的服务器(最后存在的玩家会发生什么情况),等等。这似乎非常具有挑战性。

这在很大程度上取决于您希望在服务器之间共享多少数据。您希望每台服务器处理自己的域,但帐户数据库、谁拥有哪些信息的数据、域的拓扑结构、这些数据是集中的还是分布式的,以及如何保持它们的同步。因此,除了游戏的工作之外,还有另一组元数据,服务器需要进行通信。至于游戏数据,您可能会传递事件、数据对象以及有关数据所有权和控制权的信息。除此之外,游戏中还需要一些时钟元数据来保持域的时间同步

我可能会使用一个异步队列系统,对元数据、请求和响应消息具有不同的优先级。在交换消息的基础上,类似XMPP的协议可以为您带来状态信息、身份验证、加密和其他优势。但在一开始,交付协议本身并不像消息结构和数据交换那样重要。本质上,交付协议是可互换的

示例:一名玩家将游戏单元X从域a发送到域B。域a服务器将带有事件的消息发送到域B服务器。在处理事件队列时,B接收消息并向a上的请求队列发送请求,以获取有关X单元的数据和控制/修改X单元数据的权限。请求队列具有更高的优先级,将在域a上的其他事件之前处理。域a向具有最高优先级的域B响应队列发送请求的数据和控制令牌。同时,域B服务器已经处理了3个其他事件,没有在会话中等待

  • 注:此时,A应已过时、版本或删除有关X单元的数据。如果有来自域C的数据请求,它应该从现在起将该请求转发给服务器B
  • 注意:上面的示例可以优化为使用相应的事件直接发送关于单元X的数据,但我想要一个简单的示例来说明

重要的是,您必须设计数据封装协议,可能是一些XML模式。事件处理协议。事件、允许的响应、错误消息和恢复的列表。这些都是特定于游戏的。

这在很大程度上取决于您希望在服务器之间共享多少数据。您希望每个服务器处理自己的域,