我对可扩展性有疑问。假设我有一个多人游戏,比如Uno,服务器处理所有事情。 (为简单起见,假设这是一个纯文本游戏)。例如,要在客户端中向用户打印信息,服务器可能会发送PRINT string
或CHOOSE data
(选择要播放的卡片)等。在这方面,客户端是“哑“和服务器处理游戏逻辑。
一个关于如何在协议级别上起作用的简单示例:
服务器发送:PRINT Choose a card
服务器发送:CHOOSE Red 1,Blue 1
(用户显示按钮或其他内容,然后选择红色1)
客户发送:Red 1
假设我有这种架构:
播放器类:存储用户拥有的卡片,也许是一些可以发送PRINT数据的方法(如tellData(String data
),sendPM()
可以私信用户)
服务器类:处理身份验证,允许用户创建新游戏,向用户显示他们可以加入的游戏列表
游戏类:处理玩牌的用户,处理切换到新玩家的方式,调用玩家类的方法,如tellData()
,pickCard()
等
我如何扩展它,在多台计算机上运行服务器?现在,所有用户都连接到一台服务器,并要求Player,Server和Game类与每台服务器进行交互其他。如果有人可以提供一些建议,和/或指出一些关于此的好资源/书籍,我们将不胜感激(不,这不是家庭作业或商业用途,这只是个人项目和好奇心矿)。在可伸缩性方面,我希望能够添加另一台服务器,并处理额外的播放器负载 - 但最多的并发连接将是1000.
另外,如果我们添加更多游戏,这对可扩展性挑战会变得更加困难吗?
此外,存储游戏数据的最佳方式是什么?在SQL数据库中,还是序列化对象,还是什么?通过这个,我的意思是让我们说3个用户在Uno的游戏中,并希望以后再回到它。我不想永远将他们的卡片和有关游戏的信息存储在播放器/服务器/游戏类(RAM)中 - 我想将其转储到某个地方,所以当用户登录时,可以加载信息,但这是转储到RAM中,然后转移到适当的播放器/游戏对象。
最后,如何在不必杀死服务器的情况下对服务器进行更改并重新启动它?假设服务器是用Java或Python编写的。
如果有人可以提供建议或某些资源,我们将不胜感激 - 这包括改变我最初所说的架构。
感谢您的帮助!!
编辑:您是否会就此主题推荐任何好书或演讲?
答案 0 :(得分:0)
<强> 1.Scalability:强> 涉及跨多个服务器实例的应用程序体系结构,会话被复制/共享和负载平衡。您可以选择为您的应用实现消息队列( rabbitmq )/ ESB(企业服务总线)架构。
2.易于扩展: 取决于部署和您选择的服务器。
<强> 3.Pesistance:强> 一个人的游戏涉及他在任何时间点的特定游戏状态。如果您可以在语义上表示状态信息,则可以在标记保存文件中包含数据,或者将状态信息直接存储到数据库中。 否则,您可能需要序列化对象并将它们存储在文件系统/作为数据库中的BLOB,以防状态空间非常大。
4.热部署: JVM通常需要重新启动来重新加载类文件,因此在Java服务器端,您将始终需要重新启动。在Ruby / Rails中,应用程序的某些部分可以进行热部署。如果您需要100%热部署,也许Erlang就是答案。
为了提高并发性,您还可以使用公平的服务器/应用程序架构:用于ruby或apache mina的瘦/ eventmachine,用于java的jboss netty。