定期检查node.js和mongodb(搜索丢失的记录)

时间:2014-04-29 07:27:01

标签: node.js performance mongodb timer cron

我从一堆设备收到一些定期报告并将它们存储到MongoDB数据库中。它们在大约20-30秒后进入。但是,我想检查设备何时不发送报告一段时间(例如,上一次报告超过3分钟),我想发送电子邮件或触发其他一些机制。

因此,问题是如何以最正确的方式检查丢失的事件。我考虑过一个cron作业和一堆定时器,每个定时器都与每个设备记录有关。

一个cron作业看起来不错,但我担心启动完整扫描查询会使服务器/ db超载并导致性能问题。是否有任何类型的数据库结构可以帮助这个(某种索引,可能?)。

定时器可能是更简单的解决方案,但我担心可以创建多少定时器,因为我可以获得相当多的设备。

有人可以给我一个建议,最好的方法是什么?提前致谢。

2 个答案:

答案 0 :(得分:1)

您是否在此服务器上使用Redis或类似的东西?将设备ID设置为具有任何值的键,例如1.每次设备连接时,在2-3分钟内过期密钥并更新到期日期。然后解雇cron作业以检查ID是否缺失。这应该超级快。

此外,您可以使用MongoDB的定时集合而不是Redis,但在这种情况下,您将不得不进行一系列到DB服务器的往返。 http://docs.mongodb.org/manual/tutorial/expire-data/

更新

由于您不知道您将寻找什么ID,这使问题变得复杂。另一种选择是将日志保存在单独的MongoDB集合中,其中包含您从设备获得的最后一次ping的时间戳。

索引时间戳和查询.find({timestamp: {$lt: Date.now() - 60 * 1000}})以获取陈旧设备列表。

更新现有文档而不是在每次ping上创建新文档非常重要。因此,如果您连接了10个设备,则此集合中应包含10个文档。这就是为什么您需要为此日志单独收集的原因。 关于时间序列数据的文章很棒。我希望你发现它很有用http://blog.mongodb.org/post/65517193370/schema-design-for-time-series-data-in-mongodb

答案 1 :(得分:0)

deviceid + timestamp上的索引可以很好地处理这个问题。

  1. 使用distinct()获取设备列表
  2. 对于每个设备d,

    db.events.find({ deviceid: d }).sort({ timestamp : -1 }).limit(1)

    为您提供最新的活动,您可以将其时间戳与当前时间进行比较。