我应该如何构build我的数据库和API服务器为基于回合的多人iPhone的棋盘游戏? (考虑nodejs,mongo,沙发等)

我正在为iPhone和最终Android开发基于回合的棋盘游戏。 我正在使用Appcelerator Titanium来开发它。 我的多人游戏devise与Words With Friends类似。 准备好后,用户轮stream使用,然后相应地更新对手的游戏板。

我的需求之一是有一个消息传递API,使得玩家的设备能够在移动之后相互更新游戏板的状态。 想用JSON来做这件事,并且在包含所有游戏棋子的位置的设备上保留一个JSON对象。 这是需要在本地设备上更新的对象,然后在移动完成后将更改发送给对手的设备。

过去,我已经为移动平台完成了API,为此我使用了PHP和MySQL,并在API服务器和移动设备之间来回发送JSON。 适用于低并发用户,通常非常规的应用程序。 希望这个会变得庞大;)

所以现在,我开始考虑持久套接字,而不是一个普通的httpd服务器,而不是我的新游戏。 我也认为,放弃大型LAMP堆栈可能是明智的,而且为了可扩展性和易于开发,更多地倾向于像Mongo / Couch – > node.js – > iPhone这样的数据stream。 我会坦白的说,这将是我第一次进入非sql数据库和node.js。

有兴趣听到别人在这方面的经验和经验,有更多的select/想法,以及我是否以正确的方式思考,或只是为自己头痛。

首先,Nodejs非常适合将反向TCP代理写入NoSQL数据库。 你可以让所有的标准命令通过,但是用你自己的魔法来改变/扩展它们的API,比如让MongoDB说HTTP或者CouchDB在套接字上说二进制协议。

当selectNoSQL解决scheme来存储棋盘游戏和监控玩家动作时,我认为Redis和CouchDB是最好的select。

  1. CouchDB的。 它速度快,可靠,可以处理很多并发的HTTP连接。 这可能是最好的select,因为与Redis不同,它可以在文档更改时传播消息。 持续变化的API使得每个玩家的应用程序监视其板上的变化变得非常简单。 请求可能如下所示:
      curl“$ HOST / dbname / _changes?filter = app / gameboard&feed = continuous&gameid = 38934&heartbeat = 1000 

    每当客户在相应的文档发生变化时,都会在响应中每行接收一个JSON对象。 (每隔1000毫秒换一个空行,作为一种保持活动。)

  2. Redis的。 它使用一个简单的基于行的协议(如MemcacheD ++)来通过套接字进行通信,并允许您使用任意 – 甚至二进制值来存储列表,集合,哈希。 这是非常快的,因为一切都发生在内存中,但是被持久化到磁盘asynchronous。 但是最重​​要的是你应该对它进行评估,因为它已经包含了PubSub通知。 注意,你必须在播放器共享的频道上明确发布移动通知,因为Redis在键/值改变时不会自动发布。

由于MongoDB没有观察变化的机制,所以我们不认为这是一个好的select,尽pipe可以额外付出努力才能使其发挥作用。

因此,总结一下,您可以单独使用CouchDB,单独使用Redis,或者放置在节点应用程序后面的“LAMP堆栈”来过滤/扩展已经提供的API到适合您的游戏的东西。

祝你好运!

我刚开始学习mongo,学习起来并不难。 像索引和解释的东西在那里,工作是一样的。 当涉及到体系结构时,您想要思考SQL的反面; 而不是需要一个很好的理由去正常化,你需要拿出一个很好的理由来正常化。 10gen(做mongo)的人会说,等级制的思考是一种更自然的思考事物的方式,我会同意(暂定)。 Finder也感受到了一些sql-ish,尽pipe你仍然会使用map-reduce来进行聚合查询。

从我对沙发的理解来看,最大的区别是对分布式复制有着强烈的关注。 Mongo更注重于大量数据的性能(尽pipe它们具有自动调整function,而且也具有很好的缩放比例)。 我会去mongo,除非你真的要使用沙发的分布式方面。

节点必须是有史以来最酷的,我认为这将是一个很好的应用程序。 我没有这方面的经验,但是从我读过的内容来看,这对于大量的小请求来说是非常好的,并且可以很好地扩展。 习惯性javascript对于整个事件模型来说非常合适,而且在v8中,它运行起来非常快速。