mysql - 横向扩展服务器

标签 mysql web-services scalability scaling horizontal-scaling

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

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

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

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

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

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

此外,如果我们添加更多游戏,可扩展性挑战是否会变得更加困难?

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

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

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

感谢所有帮助!!

编辑:你们有没有关于这个主题的好书或演讲推荐?

最佳答案

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

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

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

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

要提高并发性,您还可以使用事件服务器/应用架构:thin/eventmachine 适用于 ruby​​ 或 apache mina,jboss netty 适用于 java。

关于mysql - 横向扩展服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19286500/

相关文章:

PHP查询mysql数据库,echo长名称换取短表值

MySQL 在数据库中转储特定值

node.js - 跨水平服务器计算 socket.io 用户

scalability - 无冲突复制数据类型(CRDT)与Paxos或Raft

mysql - 使用来自不同表的数据计算 SQL SELECT 语句中的附加列

java - 使用 Spring 和 DBCP 和 MySQL 设置连接时区

xml - Swift,Web 服务以 Json 响应而不是 XML 响应

asp.net - 如何在 .NET XML Web 服务 WSDL 中隐藏类型继承

java - 使用 seateller api 的 OAuth 验证失败

database-design - 从一台服务器扩展到多台服务器