我正在准备一个小应用程序,它将汇总我网站上的用户数据(通过 socket.io)。我想每小时将所有数据插入我的monogDB。
最好的方法是什么?setInterval(60000) 似乎有点蹩脚:)
例如,您可以使用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() 将查询服务器以查看上次更新时间是否大于一小时。有几种方法可以做到这一点。
An easy way to store the date is to just store it as the value of Date.now() (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date) and then check for something like db.logs.find({lastUpdate:{$lt:Date.now()-6000000}}).
I think I confused a few different solutions there, but hopefully something like that will work!
If you're using Node, a nice CRON-like tool to use is Forever. It uses to same CRON patterns to handle repetition of jobs.