如何设计实时警报系统?

时间:2012-08-01 06:20:12

标签: java algorithm large-data-volumes

我有一个要求,即当db中的记录未按指定的时间间隔更新/更改时,我必须发送警报。例如,如果收到的采购订单未在一小时内处理,则应将提醒发送给交货经理。

提醒/提醒应该以间隔(包括秒)发送。如果上次修改时间是13:55:45,则应该触发警报14:55:45。可能需要跟踪数百万行。

简单的方法可能是实现自定义调度程序,所有记录都将在其中注册。但是应该轮询数据库以每秒查找更改,这将导致性能问题。

更新:

另一种基本方法是为每条记录创建一个线程并将其置于休眠状态1小时(或)使用一些具有超时的排队概念。但它仍有性能问题

有关更好的实施方法的想法吗?

4 个答案:

答案 0 :(得分:2)

可能使用内部JMS队列将是更好的解决方案 - 例如,您可能希望使用带有hornetq的预定消息功能http://docs.jboss.org/hornetq/2.2.2.Final/user-manual/en/html/examples.html#examples.scheduled-message

您可以要求经纪人在1小时后发布提醒消息。另一方面,在处理某些交易活动期间,您可以手动删除此消息,这意味着交易活动已经过处理而没有错误。

答案 1 :(得分:2)

为每个提醒使用Timer.i.e。如果上次修改时间是17:49:45,则应该在18:49:45触发警报,只需为一小时后即可完全调用的每个任务创建一个动态计时器安排。

答案 2 :(得分:2)

如果你真的坚持“实时性”,那么Java是不可能的。在Java中,您可能会对垃圾收集器的世界末日进行封锁,您无法保证确切的时间。

如果大概时间也是允许​​的,那么使用其他答案中提出的某种调度队列,如果不是,则使用实时Java或一些本地调用。

答案 3 :(得分:0)

如果我们可以假设订单的输入时间越来越长,那么:

您可以将Queue与包含time-of-orderorder-id属性的元素结合使用。

添加到数据库的每个新条目也会排入此Queue

您可以在每分钟Queue的开头检查元素。

Queue开头检查元素时,如果time-of-order已经过了一小时,则在数据库中搜索order-id条目。

如果找到并且未更新,则发送通知,否则将其从Queue出列。