我正准备一个小应用程序,它将汇总我网站上用户的数据(通过socket.io)。我想每小时将所有数据插入我的monogDB。
最好的方法是什么? setInterval(60000)似乎是一个小小的跛脚:)
答案 0 :(得分:4)
例如,您可以使用cron并将node.js应用作为预定作业运行。
修改强>
如果程序必须连续运行,那么setTimeout可能是少数可能的选择之一(实现起来非常简单)。否则,您可以将数据卸载到某个临时存储系统,例如redis,然后定期运行其他node.js程序来移动数据,但这可能会引入对其他数据库系统的新依赖性,并根据您的方案增加复杂性。在这种情况下,如果您的主node.js应用程序意外终止并丢失部分或全部数据批处理,Redis也可以作为某种故障保护解决方案。
答案 1 :(得分:1)
您应该实时汇总,而不是每小时汇总一次。
我将看一下BuddyMedia的演示文稿,了解他们如何实时聚合。我正在使用这种方法的改编版本来实现我的实时指标,它运行得非常好。
http://www.slideshare.net/pstokes2/social-analytics-with-mongodb
答案 2 :(得分:0)
为什么不使用触发数据库写入的curl
请求命中服务器?您可以将命令放在每小时的cron作业上并在本地端口上侦听。
答案 3 :(得分:0)
您可以在上次复制数据时使用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}})。
我认为我在那里混淆了一些不同的解决方案,但希望这样的东西能起作用!
答案 4 :(得分:0)
如果您正在使用Node,那么使用类似CRON的工具就是Forever。它使用相同的CRON模式来处理重复的工作。