我应该如何为回合制多人 iPhone 棋盘游戏构建数据库和 API 服务器? (考虑nodejs、mongo、couch等)

2024-01-26

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

我的需求之一是拥有一个消息 API,使 2 个玩家的设备能够在移动后相互更新游戏板的状态。考虑使用 JSON 来完成此操作,并在设备上保留一个 JSON 对象,其中包含任何给定时间所有游戏棋盘块的位置。这是需要在本地设备上更新的对象,然后在移动后将更改发送到对手的设备。

我过去曾为移动平台开发过 API,为此我将 PHP 与 MySQL 结合使用,并在 API 服务器和移动设备之间来回发送 JSON。对于低并发用户和通常非大型应用程序来说,效果很好。希望这个能变得巨大;)

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

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


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

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

  1. CouchDB。它快速、可靠,并且可以处理大量并发 HTTP 连接。这可能是最好的选择,因为与 Redis 不同的是,它可以在文档更改时广播消息。这持续改变API http://guide.couchdb.org/draft/notifications.html#continuous让您可以非常简单地让每个玩家的应用程序监控其棋盘的更改。该请求可能如下所示:

    
    curl "$HOST/dbname/_changes?filter=app/gameboard&feed=continuous&gameid=38934&heartbeat=1000  

    每当相关文档发生更改时,每个客户端都会在响应中每行收到一个 JSON 对象。 (每 1000 毫秒一个空白换行符作为一种保持活动状态。)

  2. 雷迪斯。它使用简单的基于行的协议(如 MemcacheD++)通过套接字进行通信,并允许您存储具有任意(甚至是二进制)值的列表、集合、哈希。它非常快,因为一切都发生在内存中,但异步保存到磁盘。但最重要的是你应该评估它,因为它已经PubSub http://code.google.com/p/redis/wiki/PublishSubscribe通知已内置。请注意,您必须通过玩家共享的频道显式发布移动通知,因为当键/值更改时,Redis 不会自动发布。

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

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

祝你好运!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该如何为回合制多人 iPhone 棋盘游戏构建数据库和 API 服务器? (考虑nodejs、mongo、couch等) 的相关文章

  • 无法在渲染器进程中使用 Node.js API

    无法在 Electron 中使用任何与 Electron 或节点相关的操作 未定义获取错误过程 我检查了他们指导添加节点支持的各个地方 但这已经完成了 所以卡在这里 我的主要应用程序代码是 const electron require el
  • mongodb 和 pymongo 文档大小 16Mb 限制

    我正在使用 Windows 上的 showIncludes 标志和 nix 上的 H 标志来分析构建中的包含内容 我正在用 python 脚本解析这些信息 包含的每个文件都变成一个对象 列出其子文件 它包含的文件 和祖先 包含该文件的包含路
  • 如何从配置加载套接字 io 事件监听器? [复制]

    这个问题在这里已经有答案了 我有使用套接字io 的nodejs 应用程序 我将存储在 config routes js 中的所有事件侦听器 module exports routes auth login controller auth a
  • Node / Express Handlebars - 在哪里定义自定义助手

    我正在开发一个节点 快速 车把应用程序 我刚刚发现了自定义助手 但我不知道在哪里定义它们 我尝试在实际视图模板 hbs 文件中添加一些
  • 将静态库合并为单个

    如何将静态库合并为一个 我确实有三个静态库 libSignatureLibary armv6 a libSignatureLibary armv7 a 和 libSignatureLibary i368 a 现在我想将这三个文件合并到一个库
  • NSString stringWithContentsOfFile 失败,错误代码似乎错误

    我正在尝试将文件加载到字符串中 这是我正在使用的代码 NSError error nil NSString fullPath NSBundle mainBundle pathForResource filename ofType html
  • 无法在docker容器中安装npm?

    我正在数字海洋服务器的 Docker 平台上部署一个简单的 Node js 应用程序 包 json name docker centos hello private true version 0 0 1 description Node j
  • 在这种情况下如何填充 Mongoose?

    const userSchema new mongoose Schema email type String unique true password String notifications notifiId type Schema Ty
  • 如何将 NODE_EXTRA_CA_CERTS 的值传递给使用 Serverless 部署的 AWS Lambda?

    我正在部署一个节点AWS Lambda https aws amazon com lambda with 无服务器 https github com serverless serverless 由于运行此代码的机构的内部要求 我需要通过额外
  • Node.js:无法从同一网络上的不同设备访问服务器

    注意 还有其他一些人也遇到过类似的问题 但这些问题是通过修复代码中涉及服务器如何侦听的小花絮来解决的 在我看到的示例中 他们将 127 0 0 1 作为参数放在http createServer listen 但是 我没有同样的问题 当我尝
  • Socket.io - “套接字 ID”是否被视为敏感信息?

    我正在使用 Node js 和 socket io 实现一个简单的聊天应用程序 想知道在整个对象中共享所有客户端的套接字 ID 是否被认为是一个好的做法 为了解释一下 我的每个用户都是这样表示的 nick John Doe dateJoin
  • 如何向标准 UIButton 添加徽章? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否可以在标准中添加看起来标准的徽章UIButton 如果不支持半原生 那么实现此目的最简单的方法是什么 示例图片 这是 Sascha
  • 使用nodegit切换分支/标签

    我整个早上都在尝试打开现有的存储库并使用 nodegit 更改分支或标签 文档内容很丰富 但似乎已经过时了 关于我做错了什么有什么想法吗 var NodeGit require nodegit var open NodeGit Reposi
  • 无法通过节点应用程序连接到redis,两者都在docker中

    我正在尝试将我的应用程序连接到 redis 但我得到 ioredis Unhandled error event Error connect ECONNREFUSED 127 0 0 1 6379 当我做 docker exec it ed
  • UITableViewCell显示多种字体

    我想在 uitableviewcell 中以类似于 iPhone 地址簿的不同字体显示两个单词 例如 约翰Buchanan 您应该使用两个 UILable 或者您可以使用OH属性标签 https github com AliSoftware
  • 编码时捕获 NS_AVAILABLE_IOS

    我知道如何更改支持的最低操作系统IPHONEOS DEPLOYMENT TARGET 我目前正在 Xcode 4 5 下进行开发并使用 iOS 6 0 SDK 我想做的是找到一种方法 每当我使用标记的代码时在编译中抛出警告 NS AVAIL
  • 当字段是数字时怎么说...在 mongodb 中匹配?

    所以我的结果中有一个名为 城市 的字段 结果已损坏 有时它是一个实际名称 有时它是一个数字 以下代码显示所有记录 db zips aggregate project city substr city 0 1 sort city 1 我需要修
  • 摆脱node-jsx

    在我的 NodeJS 应用程序的路由器中 我想渲染一个 React 应用程序 由于它没有被浏览器化 并且已反应 因此它返回unexpected token lt 构建时出错 我发现如果我require node jsx install 它不
  • Mongoose - 查询从多个集合中获取数据

    我想要获取猫鼬的查询在 Node js 应用程序中 如下所述输出 user js comment js 和 post js 是我使用的模型文件 user js var mongoose require mongoose var Schema
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db

随机推荐

  • 有没有 Doctrine 和 Propel 的比较?

    我看过很多 Doctrine 与 Propel 的比较 但没有一个真正说服我选择 Doctrine 而不是 Propel 我已经使用 Propel 一段时间了 几乎我读到的每一个比较都表明 Propel 没有被很好地记录为第一个问题 而且我
  • ASIHTTPRequest 与 AFNetworking 与 NSUrlRequest

    过去我用过ASIHTTPRequest但现在有NSURLRequest 我们应该使用NSURLRequest现在 有什么缺点吗 对于现在阅读本文的人 我最终使用了AFNetworking正如答案中提到的 https github com A
  • asp.net缓存多线程锁webparts

    我有以下场景 假设我们有两个不同的 Web 部件对相同的数据进行操作 一个是饼图 另一个是数据表 在其 Page Load 中 它们从数据库异步加载数据 加载后将其放入应用程序缓存中以供进一步使用或由其他 Web 部件使用 因此每个 Web
  • 使用 keras tokenizer 处理不在训练集中的新单词

    我目前正在使用 Keras Tokenizer 创建单词索引 然后将该单词索引与导入的 GloVe 字典进行匹配以创建嵌入矩阵 然而 我遇到的问题是 这似乎破坏了使用词向量嵌入的优点之一 因为当使用经过训练的模型进行预测时 如果它遇到不在分
  • JAX-WS/CXF 中的 /encoded 和 /literal 支持

    我从未在 java 中使用过 RPC 调用 所以我对需要研究的一些遗留代码有点困惑 如果可能的话 我希望您能帮助我阐明如何将 CXF 与 RPC 结合使用 1 CXF不支持rpc encoded调用 JAXWS 2 0 不支持 Rpc 编码
  • 不精确浮点常数的警告

    诸如 为什么 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 8 不是 让我想到 最好让编译器警告浮点常量 它舍入到二进制浮点类型中最接近的可表示形式 例如 0 1 和 0 8 以基数 2 浮点舍入 否则它们需要无限量的
  • 如何编译 GnuTLS

    我尝试在 Centos 6 2 上多次编译 GnuTLS 库 但没有成功 这些是步骤 我下载了荨麻2 4 root localhost opt wget http www lysator liu se nisse archive nettl
  • AngularJS 模板。内部JS不执行

    我有很多模板html页面 其中包含js代码 当我的 RouteProvider 加载此模板之一时 JS 不会执行 我不想使用 eval 我可以在外部 js 文件中编写代码并使用 requireJS 但我不知道如何使用 requireJS 停
  • JSON 数组结构变体

    以下是 3 种 JSON 数组结构格式 第一个是 JSON org 上概述的 是我熟悉的 格式 1 People name Sally age 10 name Greg age 10 第二个是命名数组元素的细微变化 我个人并不关心它 你不在
  • 如何在 Eclipse 中包含 javax.jms.* ?

    我正在尝试使用 eclipse 实现 JMS 但是当我尝试保存代码时 它表明javax jms cannot be resolved并且有no suggestions以及它推荐的 我怎样才能包含它并使用它 当我谷歌搜索时 我发现 javax
  • 如何找出我的控制台应用程序正在哪个目录中运行?

    如何找出我的控制台应用程序在 C 中运行的目录 要获取 exe 文件所在的目录 AppDomain CurrentDomain BaseDirectory 获取当前目录 Environment CurrentDirectory
  • Meteor JS 无法对数据进行排序

    我的主体中有一个按钮 单击该按钮时 应按降序排序 当我这样做时 什么也不会发生 我相信我的代码是正确的 但也许我遗漏了一些东西 这是js Tasks new Mongo Collection tasks Template body even
  • 如何使用 pdf.js 渲染 pdf 文件?

    我创建了一个 html 文件 内容如下索引 html
  • 使用 document.getElementById 更改“id=”的值

    这是正确的方法吗 a href class btn load add a a href here a 如
  • 重新加载 React Router 应用程序时出现 404 错误

    当我在本地服务器上重新加载我的应用程序时 一切都很好 但是当我在 gh pages 上托管时重新加载页面时 出现 404 错误 它不会在主页上执行此操作 但会在其他两个页面上执行此操作 这是否与远程托管有关 我对 React Router
  • Swift CoreBluetooth:CentralManager 应该在单独的线程中运行吗?

    现在我在主线程中运行所有内容 到目前为止 我只注意到 UI 变得有点滞后的多次中的一次 我想知道 utilizint CoreBluetooth 库在并发方面的一般做法是什么 您能否提供一些示例 具体应该在其他队列中运行什么 如果有的话 我
  • MQTT 连接在 Node 中工作,但不能作为 ReactJS 组件

    当我在 nodeJS 中运行它时 我有这个 mqtt 连接工作正常 但是当我将它移动到反应组件中时 我收到此错误 WebSocket 握手期间出错 net ERR CONNECTION RESET 我读过这是由与这里的默认端口有关的事情引起
  • J2ME 软键包装器

    阅读一些文章 告诉我软键因设备而异 有人说 6 或 21 表示左软键 7 或 22 表示右软键 鉴于这种情况 是否有任何好的包装器或功能或最佳实践来正确处理它 如果不适用于所有设备 那么支持大多数设备的最佳方式是什么 有轻微的黑客攻击或根本
  • Await 阻塞 UI 线程,网络相关

    我的 Windows 应用商店应用程序中有这段代码 我在其中处理按钮单击 但不知何故 当我在极少数情况下单击此按钮时 用户界面会冻结 当我连接到比我通常连接的网络更远的 Wi Fi 网络时 通常会发生这种情况 考虑到我从互联网上下载了 RS
  • 我应该如何为回合制多人 iPhone 棋盘游戏构建数据库和 API 服务器? (考虑nodejs、mongo、couch等)

    我正在为 iPhone 以及最终的 Android 开发一款回合制棋盘游戏 我正在使用 Appcelerator Titanium 来开发它 我的多人游戏设计类似于 Words With Friends 用户准备好后轮流进行 然后对手的游戏