一個可擴充套件的報警系統Quick-Alarm

一灰灰發表於2018-03-04

背景

日常的系統中,報警是不可缺少的一環,目前報警方式很多,最常見的有直接打日誌,微信報警,簡訊報警,郵件報警等;而涉及到報警,一般不可避免的需要提前設定一些基本資訊,如報警方式,報警頻率,報警使用者,開關等;

另外一個常見的問題是一般採用的是單一的報警方式,比如不管什麼型別的報警全部都用簡訊方式觸達,然後就會發現手機時常處於被淹沒的狀態了,久而久之對報警簡訊就不會敏感了

目標

因此我們準備設計一個通用的報警框架

  • 可以自由選擇報警方式,
  • 支援使用者自定義報警方式擴充
  • 支援動態的報警配置,
  • 支援使用者自定義報警規則擴充
  • 支援報警方式自動切換規則設定
  • 支援報警方式自定義自動切換規則擴充

設計

整體來說,報警主要可以劃分為三個步驟,如下:

IMAGE

  • 提交報警:對外部使用者提供的介面
  • 選擇報警:根據報警相關資訊,選擇具體的報警執行單元
  • 執行報警:實現具體的報警邏輯

從任務劃分上來看,比較清晰簡單,但是每一塊的內容又必須可以擴充,

  • 選擇報警:

    • 報警規則的制定
    • 報警規則載入器 ConfLoader
    • 報警規則變更的觸發器 ConfChangeTrigger
    • 報警規則解析器
      • ConfParse : 解析文字格式報警規則為業務物件
      • AlarmSelector :根據報警規則和報警型別,選擇具體報警執行器 AlarmExecute
  • 執行報警:

    • 執行緒池執行(以防止影響主業務流程)
    • AlarmExecute的動態擴充(支援使用者自定義的報警器實現)
    • 實際的報警邏輯

根據上面的拆解,在應用啟動的時候,就有一些事情必須去做了

  1. ConfLoader的選擇
  2. 報警規則載入
  3. AlarmExecute的載入(包括預設的+自定義實現的)

下圖顯示在應用啟動時,報警規則解析的相關步驟

應用啟動.png

至於報警執行器的載入就比較簡單了,如下圖

IMAGE

因此,整個的工作流程如下圖

alarm-arch.jpg

任務拆解

通過前面的任務設計之後,對需要做的東西有了一個大概的脈絡了,因此在正式操刀實現之前,下對整個架構進行任務拆解,看下可以具體的執行步驟可以怎麼來

  • 最直接的就是設計報警執行器AlarmExecute
    • 定義基本介面
    • 制定自定義擴充套件規則
  • 接下來就是設計報警規則
    • 如何載入報警規則?
    • 報警規則具體的定義細則
    • 報警規則的解析:即根據報警型別來獲取報警執行器
    • 報警規則動態更新支援
  • 報警執行緒池
    • 維護報警佇列
    • 報警的計數與頻率控制
  • 封裝對外使用介面

所以,通過上面的分析可以看出,這個系統的結構還是蠻簡單的,整個只需要四個部分就可以搞定,其中最主要的就是前面兩個了,後面將分別說明

小結

做一個東西,當然是希望可以帶來一些用處,或者能學習到什麼東西,才不枉花費精力來折騰一下,那麼我們這個報警系統,究竟有什麼用,或者可以從中學習到什麼東西呢?

用途:

  • 支援靈活可配的報警規則,以及具體報警業務的自定義擴充
  • 目標就是統一報警的使用姿勢,也就是不管什麼報警,都一個姿勢,但是內部可以玩出各種花樣,對使用者而言就方便簡潔了

學習:

拋開特有的知識點,可以抽象一些公共可用的地方,大概就下面這兩點了

  • 我們可以如何支援功能的動態可擴充
  • 執行緒池的使用

IV. 其他

相關博文

  1. 報警系統QuickAlarm總綱
  2. 報警系統QuickAlarm之報警執行器的設計與實現
  3. 報警系統QuickAlarm之報警規則的設定與載入
  4. 報警系統QuickAlarm之報警規則解析
  5. 報警系統QuickAlarm之頻率統計及介面封裝
  6. 報警系統QuickAlarm使用手冊

專案

宣告

盡信書則不如,已上內容,純屬一家之言,因本人能力一般,見解不全,如有問題,歡迎批評指正

掃描關注,java分享

QrCode

相關文章