【问题标题】:Using node.js to monitor changes (in database)使用 node.js 监控更改(在数据库中)
【发布时间】:2012-08-19 19:06:23
【问题描述】:

首先,我必须声明这更像是一个“策略”或“算法”之类的问题,我不确定它是否符合这里的规则。如果这是在错误的地方,请原谅我,如果是,请让我知道我应该在哪里提问。无需敌对。

我也完成了我的研究(阅读Node.js - Monitoring a database for changesInvoking a PHP script from a MySQL trigger 之类的问题),但找不到真正满意的答案,所以...

我的场景:我在一个储备拍卖网站工作。产品的价格设定为 100 美元,在拍卖期间(5 分钟到 10 分钟),价格将随机下降(多次)至随机数量。这些随机的数量和时间其实都是卖家一开始就预设好的。

会有很多买家/观察者,我们需要在价格下跌时用实时价格更新他们。我一直在考虑不同的选择: 1. 我可以使用 node.js 来查看某些文件(每个产品都会有一个文件,其中只包含该产品的当前价格,我们将简单地使用 cron 来更新这些文件?) 2. 或者,由于我们事先已经知道价格何时发生变化,我们可以为每个产品设置一个“计时器”,在特定时间唤醒并通知所有观看它的用户?

我认为也有一些更好的方法,这就是我想在这里发布它的原因,希望有人已经做过类似的事情可以对我有所启发_

非常感谢您。

【问题讨论】:

    标签: node.js


    【解决方案1】:

    这是什么类型的数据库?如果是 CouchDB,您可以关注 _changes feed 并确切知道什么时候发生了变化。如果这些买家在网络浏览器中,他们将更容易与此提要同步。

    如果它是另一种类型的数据库,您在其中没有更改 Feed,则应使用 Pub/Sub 并在更新价格后立即发布到渠道。然后您在另一端收听,如果买家在网页上,您可以使用 WebSocket 更新他们的视图。 Trello 的基础设施或多或少是这样的(Redis 用于 Pub/Sub,然后它们在订阅中挂钩 Web 套接字以将更新带到网页)。

    我认为这些是实时进行的唯一方法。监听事件。每 x 毫秒检查一次是否有变化(也称为轮询)不是实时的。

    【讨论】:

    • 我正在使用 mysql,所以带有 redis 的 pub/sub 听起来像是要走的路。我希望你不介意我问一个额外的问题:如果你提前知道你需要在 db 中更新价格(即晚上 7:01 和 9 秒,晚上 7:03 和 5 秒,晚上 7:06) ,你会用什么方法来安排这个?一个像这样的 PHP 调度器? github.com/chrisboulton/php-resque-scheduler。或者你可能会要求 nodejs 服务器自己做调度程序? (我们可以通过 php 或 nodejs 更新数据库,这两个选项都可以在这里使用)。 PHP 可以简单地让 nodejs 知道更改应该发生的时间
    • 如果您已经在使用 MySQL,我认为部署另一个数据存储没有意义(即使它们非常不同),我认为您只需要像 ZeroMQ 这样的 pubsub 的东西......关于调度,我根本不会安排它。如果您将应用程序设计为面向事件的(这是使用 NodeJS 的方式),您不需要知道下一次更新是什么时候......只需将价格更新发布到频道(并存储它)在您的数据库中以保持一致性)。
    • 谢谢,我想知道为什么我需要 Redis,它似乎只是另一种数据存储。我要求使用调度程序,因为即使更新是随机的,它们也已经预先计算好了。脚本必须以某种方式更新数据库,并且无论如何也要在预先计算的时间通知队列系统。所以我正在考虑通过 php 或 node.js 来做这件事。或者也许还有另一种我不知道的方式......
    • 您所要做的就是每次更新数据库时,您publish 某个频道。假设有 10 个人对一双鞋感兴趣。当您的脚本注意到鞋子的价格更高(新出价?)时,它会做两件事:将新价格保存到数据库,并将新价格发布到频道shoes。这 10 个人如果有兴趣查看价格变化,应该订阅频道shoes,以便他们立即获得新价格。 IMO 你在这上面有一个队列系统没有任何好处。
    【解决方案2】:

    最简单的方法是提前获取这些日期并在页面加载时将它们发送到客户端,然后在客户端设置计时器。如果您对安全性要求严格,则可以只发送时间,并让客户端仅在即将显示价格时才获取价格。如果两者都不是,您可以定期轮询服务器,或者,如果您可以将数据推送到客户端,我会使用服务器上的计时器方法。

    【讨论】:

    • 我们不希望用户知道价格下降的时间和数量,这就是我们选择 node.js 选项以便能够向他们推送数据的原因。服务器端的计时器目前看起来是最好的选择,但我需要考虑正确的实现方式。
    • 只有知道如何调试(正确的)javascript 内存或(在未加密数据的情况下)读取(并搜索)源代码的用户才能获得该数据。这可能是一个风险,具体取决于用户群。
    猜你喜欢
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    相关资源
    最近更新 更多