iphone - 我应该如何为基于回合制的多人 iPhone 棋盘游戏构建我的 DB 和 API 服务器? (考虑 nodejs、mongo、沙发等)

标签 iphone api mongodb couchdb node.js

我正在开发一款适用于 iPhone 和 Android 的回合制棋盘游戏。我正在使用 Appcelerator Titanium 来开发它。我的多人游戏设计类似于 Words With Friends。用户准备好后轮流,然后对手的棋盘相应更新。

我的一个需求是有一个消息 API,它可以让两个玩家的设备在移动后互相更新游戏板的状态。考虑使用 JSON 执行此操作,并在设备上保留一个 JSON 对象,该对象包含任何给定时间所有游戏棋盘的位置。这是需要在本地设备上更新的对象,然后在移动后将更改发送到对手的设备。

我过去曾为移动平台开发过 API,为此我将 PHP 与 MySQL 结合使用,并在 API 服务器和移动设备之间来回发送 JSON。对于低并发用户和一般非大型应用程序来说,这只是花花公子。这是希望这个会变得庞大;)

所以现在,我开始考虑持久性套接字以及我的新游戏是否需要它们,而不是一般的 httpd 服务器等。我还认为放弃大 LAMP 堆栈可能是明智的,为了可扩展性和易于开发,更倾向于像 Mongo/Couch -> node.js -> iPhone 这样的数据流。老实说,这将是我第一次涉足非 sql 数据库和 node.js。

有兴趣听听其他人对此的看法和经验,更多的选择/想法,以及我是否以正确的方式思考它,或者只是为自己制造头痛。

最佳答案

首先,Nodejs 非常适合向 NoSQL 数据库编写反向 TCP 代理。您可以让所有标准命令通过,但使用您自己的魔法更改/扩展它们的 API,例如让 MongoDB 使用 HTTP 或 CouchDB 使用套接字上的二进制协议(protocol)。

在选择 NoSQL 解决方案来存储棋盘游戏棋子和监控玩家移动时,我认为 Redis 和 CouchDB 都是最佳选择。

  1. 沙发数据库。它快速、可靠,并且可以处理大量并发 HTTP 连接。这可能是最好的选择,因为与 Redis 不同,它可以在文档更改时广播消息。 continous changes API让您可以非常简单地让每个玩家的应用程序监控他们的棋盘变化。请求可能如下所示:

    <pre>curl "$HOST/dbname/_changes?filter=app/gameboard&feed=continuous&gameid=38934&heartbeat=1000</pre>
    每当相关文档发生更改时,每个客户端都会在响应中的每行收到一个 JSON 对象。 (并且每 1000 毫秒有一个空白换行符作为一种保活。)

  2. Redis。它使用简单的基于行的协议(protocol)(如 MemcacheD++)通过套接字进行通信,并允许您存储具有任意值(甚至是二进制值)的 Lists、Sets、Hashes。它非常快,因为一切都发生在内存中,但异步保存到磁盘。但最重要的是你应该评估它,因为它已经有 PubSub内置通知。请注意,您必须通过玩家共享的 channel 明确发布移动通知,因为 Redis 不会在键/值更改时自动发布。

由于 MongoDB 没有一种机制来观察发生的变化或执行 pubsub,我不认为这是一个好的选择,尽管通过额外的努力你可以让它工作。

因此,总而言之,您可以单独使用 CouchDB、Redis 或放置在 Node 应用程序后面的任何一种替换“大型 LAMP 堆栈”,以过滤/扩展它们已经提供的 API,使其适合您的游戏。

祝你好运!

关于iphone - 我应该如何为基于回合制的多人 iPhone 棋盘游戏构建我的 DB 和 API 服务器? (考虑 nodejs、mongo、沙发等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3605115/

相关文章:

php - Instagram API 分页

mongodb - 如何在 Kubernetes 中使用持久卷部署 MongoDB?

找不到 Swift mongoc.h 文件

python - CSV 中的 URL 未传递给函数

javascript - 查询 MongoDB 的数据范围

iphone - CGImageCreateWithImageInRect 无法正常工作

iphone - UIWebView 不自动调整大小以适应屏幕

iphone - 有没有办法识别用户iPhone的访问并自动调整网页以适应iPhone屏幕尺寸?

iphone - UIBarButtonItem 图标通过 IB 添加时为白色,以编程方式添加时为黑色

javascript - 如何使用javascript通过api在我的谷歌应用程序脚本中运行一个函数