繁体   English   中英

如何设计实时警报系统?

[英]How to design a Real Time Alerting System?

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

提醒/警报应准确发送间隔(包括秒)。 如果最后修改时间是13:55:45,则警报应在14:55:45触发。 可能需要跟踪一百万行。

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

更新:

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

有更好的方法来实现相同的想法吗?

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

您可以要求经纪人在正好1小时后发布警报消息。 另一方面,在处理某些交易活动时,您可以手动删除此消息,表示该交易活动已被正确处理。

为每个提醒使用计时器。即,如果最后修改的时间是17:49:45,则应该在18:49:45触发警报,只需为每个将在一个小时后调用的任务创建一个动态计时器时间表。

如果您真的坚持“实时性”,那么在Java中是不可能的。 在Java中,您可能会使垃圾回收器的进入世界的阶段陷入困境,并且您永远无法保证确切的时间。

如果大约时间也是允许​​的,则使用其他答案中建议的某种计划的队列,如果不允许,则使用实时Java或某些本机调用。

如果我们可以假设输入的订单时间增加,那么:

您可以对具有属性time-of-orderorder-id元素使用Queue

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

您可以每分钟在Queue开始处检查一次元素。

Queue的开头检查元素时,如果距离time-of-order过去了一个小时,则在数据库中搜索具有order-id的条目。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM