我应该如何为基于回合制的多人 iPhone 棋盘游戏构建我的 DB 和 API 服务器? (考虑 nodejs、mongo、沙发等)
Posted
技术标签:
【中文标题】我应该如何为基于回合制的多人 iPhone 棋盘游戏构建我的 DB 和 API 服务器? (考虑 nodejs、mongo、沙发等)【英文标题】:How should I architect my DB & API server for a turn based multiplayer iPhone board game? (thinking about nodejs, mongo, couch, etc) 【发布时间】:2011-04-06 00:41:34 【问题描述】:我正在开发一款适用于 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。
有兴趣听听其他人对此的看法和经验,更多的选择/想法,以及我是否以正确的方式思考它,或者只是让自己头疼。
【问题讨论】:
对于任何感兴趣的人,我刚刚发布了一个新问题来继续这个过程:***.com/questions/3618052/… 【参考方案1】:首先,Nodejs 非常适合向 NoSQL 数据库编写反向 TCP 代理。您可以让所有标准命令通过,但使用您自己的魔法更改/扩展它们的 API,例如让 MongoDB 使用 HTTP 或 CouchDB 使用套接字上的二进制协议。
在选择 NoSQL 解决方案来存储棋盘游戏棋子和监控玩家移动时,我认为 Redis 和 CouchDB 都是最佳选择。
-
沙发数据库。它快速、可靠,并且可以处理大量并发 HTTP 连接。这可能是最好的选择,因为与 Redis 不同,它可以在文档更改时广播消息。 continous changes API 让您可以非常简单地让每个玩家的应用程序监控他们的棋盘变化。该请求可能如下所示:
<pre>curl "$HOST/dbname/_changes?filter=app/gameboard&feed=continuous&gameid=38934&heartbeat=1000</pre>
只要相关文档发生更改,每个客户端都会在响应中的每行收到一个 JSON 对象。 (并且每 1000 毫秒有一个空白换行符作为一种保活。)
Redis。它使用简单的基于行的协议(如 MemcacheD++)通过套接字进行通信,并允许您存储具有任意值(甚至是二进制值)的 Lists、Sets、Hashes。它非常快,因为一切都发生在内存中,但异步保存到磁盘。但最重要的是,您应该评估它,因为它已经包含PubSub 通知。请注意,您必须通过玩家共享的频道显式发布移动通知,因为 Redis 不会在键/时自动发布值变化。
由于 MongoDB 没有一种机制来观察发生的变化或执行 pubsub,我不认为这是一个好的选择,尽管通过额外的努力你可以让它工作。
因此,总而言之,您可以单独使用 CouchDB、Redis 或放置在节点应用程序后面的任何一种替换“大型 LAMP 堆栈”,以过滤/扩展它们已经提供的 API,使其适合您的游戏。
祝你好运!
【讨论】:
感谢您的详细描述。自从您的帖子以来,我已经下载了 couchDB 并玩了一下。很酷的东西。当我有更多问题时,我会回复,我相信很快就会回复!【参考方案2】:我刚开始学mongo,学起来并不难。诸如索引和解释之类的东西在那里并且工作相同。当谈到架构时,您想与 SQL 相反;不需要一个很好的理由去规范化,你需要想出一个很好的理由来规范化。 10gen 的人(制作 mongo)会说,考虑分层是一种更自然的思考方式,我会(暂时)同意这一点。尽管您仍将使用 map-reduce 进行聚合查询,但查找器也感觉有点像 sql-ish。
根据我对 couch 的了解,最大的不同是它非常关注分布式复制。 Mongo 更多地关注海量数据的性能(尽管它们也有自动分片和一个很好的扩展故事)。我会去 mongo,除非你真的要使用沙发的分布式方面。
Node 必须是有史以来最酷的东西,我认为这将是一个很棒的应用程序。我对它的经验为零,但根据我的阅读,它非常适合大量的小请求,并且可以很好地扩展。惯用的 javascript 非常适合整个事件模型,并且在 v8 中它运行得非常快。
【讨论】:
如果你喜欢 MongoDB,你真的应该尝试一下 CouchDB 的做事方式。它非常不同,因为它在提供内置 Web 服务器、CouchApps 等的同时如何实现性能和持久性。如果您只想存储 JSON 数据,则两者都可以正常工作,但您可以构建使用 CouchDB 的整个 Web 应用程序,仅此而已。 guide.couchdb.org以上是关于我应该如何为基于回合制的多人 iPhone 棋盘游戏构建我的 DB 和 API 服务器? (考虑 nodejs、mongo、沙发等)的主要内容,如果未能解决你的问题,请参考以下文章