Node.js - 这是一个适合经常更新内容的好结构吗?

3
作为我昨天的问题的后续,关于Node.js和与客户端通信,我正在尝试理解以下内容的工作原理。

案例:

我有一个网站,内容非常频繁地更新。假设这次更新的内容是一份带有温度的位置列表(是的,一个气象服务)。

现在,每当客户查询某个位置时,他或她会访问像这样的网址:example.com/location/id,其中 id 对应于我的数据库中该位置的 id。


实现:

在服务器上,checktemps.js每隔一段时间(大约每两秒)循环遍历我(mySQL)数据库中的所有位置,并检查相应的温度。然后,它将这些数据存储在checktemps.js中的一个数组中。由于温度可能一直在变化,因此保持对数据库更新的检查非常重要。

当请求example.com/location/id时,checktemps.js查找具有记录id = id的数组。然后,它使用相应的温度作出响应。


问题:

暂时不涉及纯文本、HTML或Ajax调用。 我只是好奇我是否理解正确? Node.js是一件相当不寻常的事情,所以我试着弄清楚这是否合乎逻辑?


1
不要使用mySQL。使用像redis这样的发布/订阅数据库,其中数据库可以“告诉”您数据已更改。 - Raynos
2个回答

2
在服务器端,checktemps.js会循环遍历(大约每隔两秒)我(MySQL)数据库中的所有位置,并检查相应的温度。然后,它将此数据存储在checktemps.js内的数组中。
这是极其低效的。您不应该这样做循环(每隔两秒或更短时间)。
模块
下面我将尝试列出我将使用的模块(包括node.js模块和其他模块),以使其更有效率:
  • npm 是 Node.js 的包管理器。您可以使用它来安装和发布您的 Node.js 程序,它可以管理依赖关系并执行其他酷炫的功能。

    我真诚地希望您已经了解 npm,如果没有,我建议您尽快学习它。一开始,您只需要学习如何安装软件包,但这非常容易。您只需要键入 npm install <package-name>。稍后,我真的希望您学会编写自己的包以管理依赖关系。

  • Express 是一个高性能、高级别的 Web 开发框架,适用于 Node.js。

    TJ 的这个 Sinatra 风格的框架真的很棒,你应该阅读文档/观看可用的 screencasts 以了解它的强大功能。

    Socket.IO 旨在使实时应用程序在每个浏览器和移动设备中都成为可能,消除了不同传输机制之间的差异。

  • Redis 是一个开源的、先进的键值存储系统。由于键可以包含字符串、哈希、列表、集合和排序集,因此它经常被称为数据结构服务器。

    就像 Raynos 所说的那样,这个极快/性感的数据库具有 pubsub 语义,这是高效地处理您的问题所需的。我认为您应该真正玩一下这个数据库(tutorial) ,以欣赏它的原始功能。安装起来也很容易:make install

  • Node_redis 是一个完整的 Redis 客户端,适用于 node.js。它支持所有 Redis 命令,包括 MULTI、WATCH 和 PUBLISH / SUBSCRIBE。

原型

我刚刚想起我曾经帮助过另一个用户解决有关 pubsub的问题。我认为当您查看那个答案时,您将更好地了解如何正确执行它。代码已经发布了一段时间,并且应该进行更新(在express方面进行了微小的更改):

var     PORT        = 3000,
            HOST        = 'localhost',
            express = require('express'),
            io          = require('socket.io'),
            redis       = require('redis'),
            app         = module.exports = express.createServer(),
            socket  = null;

app.use(express.static(__dirname + '/public'));

if (!module.parent) {
    app.listen(PORT, HOST);
    console.log("Express server listening on port %d", app.address().port)
    socket = io.listen(app);

    socket.on('connection', function(client) {
        var subscribe = redis.createClient();
        subscribe.subscribe('pubsub'); // listen to messages from channel pubsub

        subscribe.on("message", function(channel, message) {
            client.send(message);
        });

        client.on('message', function(msg) {
        });

        client.on('disconnect', function() {
            subscribe.quit();
        });
    });
}

我已经将更新后的代码和所有依赖项压缩在一起compressed,但你仍需要先启动Redis。

问题

希望这能给你一个实现的思路。


欢迎你,Kriem。另外,我相信他们已经更新了 socket.io 到 0.7.x 版本,而不是 0.6.x 版本。因此,通过 npm 更新 socket.io 可能会因为 API 的微小变化而破坏代码... - Alfred

0

使用node.js,你可以做得更好。请求/响应的概念自Web诞生以来就深入人心。但是,如果您打开网站/应用程序并永远不结束此调用,则只需执行一个ajax请求即可。现在,node.js可以在客户端有更新时随时发送数据。在YouTube上搜索Introduction to Node.js with Ryan Dahl(node.js的创建者),他在那里解释了这一点。然后,您就可以实时更新,而无需一直由客户端发出请求。


1
理论上这很好,但实际上由于XHR的浏览器实现而失败。使用Socket.IO将是一个更好的解决方案。 - Tobias P.
@Tobias P. - 你能提供一个更好的答案吗?我仍然不确定这在实践中如何运作。 - Kriem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接