【问题标题】:Scaling a Server Horizontally水平扩展服务器
【发布时间】:2013-10-17 15:59:18
【问题描述】:

我有一个关于可扩展性的问题。假设我有一个多人游戏,比如 Uno,服务器处理所有事情。 (为简单起见,假设这是一个纯文本游戏)。例如,要在客户端获取信息打印给用户,服务器可能会发送PRINT string,或CHOOSE data(选择要玩的牌)等。在这方面,客户端是“哑巴”,而服务器处理游戏逻辑。

这是如何在协议级别上工作的一个简单示例:
服务器发送:PRINT Choose a card
服务器发送:CHOOSE Red 1,Blue 1(用户显示按钮或其他东西,然后选择红色 1)
客户端发送:Red 1

假设我有这样的架构:
Player Class:存储用户拥有的卡片,可能是一些可以发送 PRINT 数据的方法(例如 tellData(String data),sendPM()可以私信用户)

服务器类:处理身份验证,允许用户创建新游戏,向用户显示他们可以加入的游戏列表

游戏类:处理用户打牌,处理轮到新玩家的操作,调用玩家类上的方法,如tellData()pickCard()

我将如何扩展它以在多台计算机上运行服务器? 现在,所有用户都连接到一个服务器,并且需要 Player、Server 和 Game 类与每个用户交互其他。如果有人可以提供一些建议,和/或向我指出一些很好的资源/书籍,将不胜感激(不,这不是家庭作业或企业的东西,这只是一个个人项目和好奇心矿)。在可扩展性方面,我希望能够添加另一台服务器,并处理玩家的额外负载——但最多并发连接数为 1000。

另外,如果我们添加更多游戏,这是否会变得更加难以应对可扩展性挑战?

此外,存储游戏数据的最佳方式是什么?在 SQL 数据库中,或序列化对象,还是什么?我的意思是,假设有 3 个用户在玩 Uno 游戏,并且想稍后再玩。我不想永远将他们的卡片和有关游戏的信息存储在 Player/Server/Game 类 (RAM) 中 - 我想将其转储到某个地方,因此当用户登录时,可以从中加载信息,但是这是转储到 RAM,然后是适当的 Player/Game 对象。

最后,我怎样才能对服务器进行更改而不必杀死它并重新启动它?假设服务器是用 Java 或 Python 编写的。

如果有人可以提供建议或一些资源,我们将不胜感激 - 这包括更改我最初陈述的架构。

感谢大家的帮助!!

编辑:你们有什么好的书籍或演讲推荐吗?

【问题讨论】:

    标签: mysql web-services scalability scaling horizontal-scaling


    【解决方案1】:

    1.可扩展性: 涉及跨多个服务器实例的应用程序架构,会话被复制/共享和负载平衡。您可以选择为您的应用实现消息队列 (rabbitmq) / ESB(企业服务总线)架构。

    2.易于缩放: 取决于部署和您选择的服务器。

    3.持久性: 一个人的游戏涉及他在任何时间点的特定游戏状态。如果您可以在语义上表示状态信息,则可以将数据保存在标记保存文件中,或者将状态信息直接存储到数据库中。 否则,您可能需要序列化对象并将它们存储在文件系统中/作为 DB 中的 BLOB,以防状态空间非常庞大。

    4.热部署: JVM 通常总是需要重新启动才能重新加载类文件,因此在 java 服务器端,您总是需要重新启动。在 Ruby/Rails 中,应用程序的某些部分可以热部署。如果您需要 100% 的热部署能力,也许 Erlang 就是答案。

    为了提高并发性,您还可以使用事件服务器/应用程序架构:用于 ruby​​ 或 apache mina 的 Thin/eventmachine,用于 java 的 jboss netty。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-24
      • 2011-02-08
      • 1970-01-01
      • 2018-04-29
      • 2011-09-15
      • 1970-01-01
      • 2021-04-18
      • 2011-08-05
      相关资源
      最近更新 更多