【问题标题】:Best way to update DB (mongo) every hour?每小时更新数据库(mongo)的最佳方式?
【发布时间】:2013-03-09 17:11:53
【问题描述】:

我正在准备一个小应用程序,它将汇总我网站上的用户数据(通过 socket.io)。我想每小时将所有数据插入我的monogDB。

最好的方法是什么? setInterval(60000) 似乎有点蹩脚:)

【问题讨论】:

  • 如果可以的话,让它成为一个 cron 任务可能是最简单的。

标签: mongodb node.js express socket.io


【解决方案1】:

例如,您可以使用 cron 并按计划作业运行您的 node.js 应用程序。

编辑:

如果程序必须连续运行,那么 setTimeout 可能是少数可能的选择之一(实现起来非常简单)。否则,您可以将数据卸载到某个临时存储系统,例如 redis,然后定期运行其他 node.js 程序来移动数据,但这可能会引入对其他数据库系统的新依赖,并根据您的场景增加复杂性。在这种情况下,Redis 也可以作为某种故障安全解决方案,以防您的主要 node.js 应用程序意外终止并丢失部分或全部数据批次。

【讨论】:

  • 问题是我的应用程序应该连续运行,因为它会聚合实时数据。所以我必须弄清楚如何编写前一个小时收集的数据。
【解决方案2】:

您应该实时汇总,而不是每小时一次。

我会看一下 BuddyMedia 的这个演示文稿,看看他们是如何进行实时聚合的。我正在为我的实时指标使用这种方法的改编版本,它的效果非常好。

http://www.slideshare.net/pstokes2/social-analytics-with-mongodb

【讨论】:

    【解决方案3】:

    为什么不直接使用触发数据库写入的curl 请求访问服务器?您可以将命令放在每小时的 cron 作业中并在本地端口上侦听。

    【讨论】:

      【解决方案4】:

      您可以在上次复制数据时使用 mongo 存储,并且每次收到任何请求时,您都可以检查自上次复制数据以来已经过去了多长时间。

      或者您可以尝试 setInterval(checkRestore, 60000) 每分钟检查一次。 checkRestore() 将查询服务器以查看上次更新时间是否大于一小时。有几种方法可以做到这一点。

      存储日期的一种简单方法是将其存储为 Date.now() (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date) 的值,然后检查某些内容比如 db.logs.find({lastUpdate:{$lt:Date.now()-6000000}})。

      我想我在那里混淆了一些不同的解决方案,但希望这样的方法能奏效!

      【讨论】:

        【解决方案5】:

        如果您使用的是 Node,一个不错的类似 CRON 的工具是 Forever。它使用相同的 CRON 模式来处理重复的作业。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-11-19
          • 1970-01-01
          • 1970-01-01
          • 2018-05-14
          • 2011-07-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多