[英]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-order
和order-id
元素使用Queue
。
添加到數據庫的每個新條目也都排隊到此Queue
。
您可以每分鍾在Queue
開始處檢查一次元素。
在Queue
的開頭檢查元素時,如果距離time-of-order
過去了一個小時,則在數據庫中搜索具有order-id
的條目。
如果找到並且未更新,則發送通知,否則從Queue
中將其出隊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.