用于检测陈旧数据的可扩展算法

时间:2011-08-16 08:28:21

标签: algorithm monitoring heartbeat

问题在于:

许多不同服务器上安装的“代理”每5秒向中央服务器发送“心跳”信号。我怎样才能找到那些主动超过10秒的心跳并发出警报的人?

如果你不考虑scalablity,问题很简单。在最简单的形式中,您可以记录从数据库表中的每个代理接收的最新心跳的时间戳,并运行常规查询以查找早于阈值的那些。

然而,这个解决方案无法扩展到数百万个代理商。

我正在寻找使这成为可能的算法或技术。

3 个答案:

答案 0 :(得分:2)

  1. 使用地图:AgentId - > LastHearbeatTime
  2. 使用11套(假设分辨率为1秒就足够了),每套保存在1秒窗口内报告的代理ID。
  3. 每次代理报告心跳时: 1.在地图中找到它 2.从相关集中删除它 3.在地图中更新它 4.将其添加到相关集

    定义一个主题:每秒一次,最旧的一组到期。它应该是空的。如果没有 - 它包含没有报告的代理商ID。一旦集合到期,您可以重复使用它(循环数组)。

    我相信它可以在没有锁的情况下实现(也许你需要12套)。

答案 1 :(得分:1)

在不了解语言和平台的情况下,有点难以就详细实施提出建议,但我的建议与Lior Kogan有些相似。 但是,在我看来,你只需要两套,不涉及地图:

假设您有两个表示集合A和B的变量。

每次心跳都会从集合A中删除代理ID。 每隔5秒,一个不同的线程为B中的每个代理ID引发一个警报,然后设置B = A,最后但并非最不重要的是创建一个包含所有代理ID的集合,并将A设置为等于(如果代理ID的数量)非常大,您可以在一张支票和另一张支票之间准备新套装,只在剩余时间内休息。 只要您使用无锁集合集,只有在更改指向每个集的变量时才需要锁定。 性能在很大程度上取决于所述实现的算法复杂性,如果你这样做,你应该为具有最佳性能(不一定是最好的大O,例如,如果wost-case延迟对你很重要)的删除特权。

作为旁注,如果内存不是问题或者故障相对较少,当您检查是否需要发出警报并执行此操作时,您可以在自己的线程上执行此操作并获得可能有趣的性能加速(再次,平台和运行时很重要,因为在erlang中这将是一件轻而易举的事情,但在Windows中,创建一个完整的新线程的成本可能会超过性能优势,如果失败很少),代价是保持旧的B设置存储器中。

答案 2 :(得分:-1)

MongoDB非常适合此类用途。虽然不完全是一种算法,但它确实适合创建此服务所需的基础技术。我们在CopperEgg上使用它来为我们的RevealCloud产品完成你所说的 - 当系统离开一段时间时我们会发出警报 - 每5秒采样一次。我希望能够更多地了解您的想法和用例。你能提供更多细节吗?