【发布时间】:2013-03-09 17:11:53
【问题描述】:
我正在准备一个小应用程序,它将汇总我网站上的用户数据(通过 socket.io)。我想每小时将所有数据插入我的monogDB。
最好的方法是什么? setInterval(60000) 似乎有点蹩脚:)
【问题讨论】:
-
如果可以的话,让它成为一个 cron 任务可能是最简单的。
标签: mongodb node.js express socket.io
我正在准备一个小应用程序,它将汇总我网站上的用户数据(通过 socket.io)。我想每小时将所有数据插入我的monogDB。
最好的方法是什么? setInterval(60000) 似乎有点蹩脚:)
【问题讨论】:
标签: mongodb node.js express socket.io
例如,您可以使用 cron 并按计划作业运行您的 node.js 应用程序。
编辑:
如果程序必须连续运行,那么 setTimeout 可能是少数可能的选择之一(实现起来非常简单)。否则,您可以将数据卸载到某个临时存储系统,例如 redis,然后定期运行其他 node.js 程序来移动数据,但这可能会引入对其他数据库系统的新依赖,并根据您的场景增加复杂性。在这种情况下,Redis 也可以作为某种故障安全解决方案,以防您的主要 node.js 应用程序意外终止并丢失部分或全部数据批次。
【讨论】:
您应该实时汇总,而不是每小时一次。
我会看一下 BuddyMedia 的这个演示文稿,看看他们是如何进行实时聚合的。我正在为我的实时指标使用这种方法的改编版本,它的效果非常好。
http://www.slideshare.net/pstokes2/social-analytics-with-mongodb
【讨论】:
为什么不直接使用触发数据库写入的curl 请求访问服务器?您可以将命令放在每小时的 cron 作业中并在本地端口上侦听。
【讨论】:
您可以在上次复制数据时使用 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}})。
我想我在那里混淆了一些不同的解决方案,但希望这样的方法能奏效!
【讨论】:
如果您使用的是 Node,一个不错的类似 CRON 的工具是 Forever。它使用相同的 CRON 模式来处理重复的作业。
【讨论】: