Node.js Web 套接字服务器:我的数据管理想法是不是稳定/可扩展?

Posted

技术标签:

【中文标题】Node.js Web 套接字服务器:我的数据管理想法是不是稳定/可扩展?【英文标题】:Node.js web sockets server: Is my idea for data management stable/scalable?Node.js Web 套接字服务器:我的数据管理想法是否稳定/可扩展? 【发布时间】:2010-08-14 20:31:13 【问题描述】:

我正在开发一个 html5 浏览器多人角色扮演游戏,其中 node.js 在后端运行,并带有一个用于客户端数据传输的 Web 套接字插件。我面临的问题是访问和更新用户数据,正如您可以想象的那样,即使连接的用户很少,这个过程也会每秒发生多次。

我进行了一些搜索,发现只有 2 个支持 mysql 功能的 node.js 插件,但它们都处于早期开发阶段,我发现为用户所做的每一个小动作查询数据库效率不高.

我的想法是让 node.js 在用户连接并检索与该用户相关的所有信息时使用 php 访问数据库。然后收集的信息将存储在 node.js 中的 javascript 对象中。这将发生在所有玩游戏的用户身上。然后将更新应用于对象。当用户注销时,存储在对象中的数据将更新到数据库并从对象中删除。

需要注意的一点是,我会将不同类型的数据分成不同的对象,这样更常访问的数据不会与会减慢查找速度的数据混合在一起。从理论上讲,如果这个项目获得了很多用户,出于显而易见的原因,我会设置一个上限,即一次可以登录单个服务器的用户数量。

我想知道这是否是个好主意。拥有大对象会大大降低 node.js 服务器的速度吗?如果您碰巧对针对我的情况的其他可能解决方案有任何想法,我欢迎他们。

谢谢

【问题讨论】:

这个 MySQL 模块至少可以工作:github.com/stevebest/node-mysql 【参考方案1】:

就您的策略而言,为了将数据保存在 php 中的中间对象中,您正在为您的应用程序增加非常高的复杂性。

只是 node.js 和 php 之间的通信似乎很复杂,并且不能保证这会比将事情正确地放入 mysql 更快。在您和您的数据之间设置任何不必要的障碍将使事情变得更加难以管理。

您似乎需要更快速的数据解决方案。你可以考虑使用像mongodb这样的异步数据库,或者redis可以快速读写(redis会在内存中写入,应该非常快)

这些都与 node.js 一起使用,只是因为它们可以处理实时数据加载。

实际上,redis 是您真正需要的,它实际上将内容存储在内存中,然后定期将其持久化到磁盘中。你不能比这更快,但你需要足够的内存。如果 ram 看起来有问题,请使用仍然非常快的 mongodb。

缺点是您需要重新学习有关数据持久性的概念,这很难。我自己正在这样做!

【讨论】:

看来我并没有明确我最初的想法。我计划将数据存储在服务器上的 JavaScript 对象中,并且仅在用户连接时使用 PHP 来查询服务器。尽管如此,听起来 Redis 是我正在寻找的东西。谢谢您的意见。 :)【参考方案2】:

我有一个应用程序几乎按照您的描述进行 - 我选择这样做是因为节点的 MYSQL 驱动程序在开发时不稳定/未记录。

我有 200 个连接的用户 - 每秒请求数据 3-5 次,并通过从 apache 返回 JSON 的 php 页面(每个 200-800 毫秒)获取整个表,大约 1000 行并将内容放入数组中。我遍历数组并根据请求查找相关数据 - 它可以工作,而且速度很快 - 不会对 cpu 和内存造成重大负担。

所有数据的插入/更新,有限的都通过php/mysql。

优点: 1. 它是一个简单的解决方案,具有已知的稳定服务。 2.每200-800毫秒只有1个客户端连接到apache/php/mysql 3.所有节点客户端都获得了非阻塞的好处。 4. 在 2 个小型“PC 风格”服务器上运行 - 每秒处理大约 8000 个请求。 (阿帕奇长凳)

缺点: 1. 很多 - 但它可以完成工作。

我发现我的节点脚本可能每周停止 -1-2 次 - 可能是由于一些连接问题(未解决) - 但结合 Upstart 和 Monit 它重新启动并发出警报没有问题.....

【讨论】:

以上是关于Node.js Web 套接字服务器:我的数据管理想法是不是稳定/可扩展?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 同时运行一个 http 服务器和 web socket 服务器

Heroku上的Node.js Web Socket H15空闲连接超时

如何将数据从 Android 中的数据报套接字发送到 Node js 服务器?

如何在 Node.js 中调试错误 ECONNRESET?

结合node.js和Python

Node js服务器和c ++客户端套接字io连接,无法发出或读取数据