背景
日常的系統中,報警是不可缺少的一環,目前報警方式很多,最常見的有直接打日誌,微信報警,簡訊報警,郵件報警等;而涉及到報警,一般不可避免的需要提前設定一些基本資訊,如報警方式,報警頻率,報警使用者,開關等;
另外一個常見的問題是一般採用的是單一的報警方式,比如不管什麼型別的報警全部都用簡訊方式觸達,然後就會發現手機時常處於被淹沒的狀態了,久而久之對報警簡訊就不會敏感了
目標
因此我們準備設計一個通用的報警框架
- 可以自由選擇報警方式,
- 支援使用者自定義報警方式擴充
- 支援動態的報警配置,
- 支援使用者自定義報警規則擴充
- 支援報警方式自動切換規則設定
- 支援報警方式自定義自動切換規則擴充
設計
整體來說,報警主要可以劃分為三個步驟,如下:
- 提交報警:對外部使用者提供的介面
- 選擇報警:根據報警相關資訊,選擇具體的報警執行單元
- 執行報警:實現具體的報警邏輯
從任務劃分上來看,比較清晰簡單,但是每一塊的內容又必須可以擴充,
-
選擇報警:
- 報警規則的制定
- 報警規則載入器
ConfLoader
- 報警規則變更的觸發器
ConfChangeTrigger
- 報警規則解析器
ConfParse
: 解析文字格式報警規則為業務物件AlarmSelector
:根據報警規則和報警型別,選擇具體報警執行器AlarmExecute
-
執行報警:
- 執行緒池執行(以防止影響主業務流程)
- AlarmExecute的動態擴充(支援使用者自定義的報警器實現)
- 實際的報警邏輯
根據上面的拆解,在應用啟動的時候,就有一些事情必須去做了
- ConfLoader的選擇
- 報警規則載入
- AlarmExecute的載入(包括預設的+自定義實現的)
下圖顯示在應用啟動時,報警規則解析的相關步驟
至於報警執行器的載入就比較簡單了,如下圖
因此,整個的工作流程如下圖
任務拆解
通過前面的任務設計之後,對需要做的東西有了一個大概的脈絡了,因此在正式操刀實現之前,下對整個架構進行任務拆解,看下可以具體的執行步驟可以怎麼來
- 最直接的就是設計報警執行器
AlarmExecute
- 定義基本介面
- 制定自定義擴充套件規則
- 接下來就是設計報警規則
- 如何載入報警規則?
- 報警規則具體的定義細則
- 報警規則的解析:即根據報警型別來獲取報警執行器
- 報警規則動態更新支援
- 報警執行緒池
- 維護報警佇列
- 報警的計數與頻率控制
- 封裝對外使用介面
所以,通過上面的分析可以看出,這個系統的結構還是蠻簡單的,整個只需要四個部分就可以搞定,其中最主要的就是前面兩個了,後面將分別說明
小結
做一個東西,當然是希望可以帶來一些用處,或者能學習到什麼東西,才不枉花費精力來折騰一下,那麼我們這個報警系統,究竟有什麼用,或者可以從中學習到什麼東西呢?
用途:
- 支援靈活可配的報警規則,以及具體報警業務的自定義擴充
- 目標就是統一報警的使用姿勢,也就是不管什麼報警,都一個姿勢,但是內部可以玩出各種花樣,對使用者而言就方便簡潔了
學習:
拋開特有的知識點,可以抽象一些公共可用的地方,大概就下面這兩點了
- 我們可以如何支援功能的動態可擴充
- 執行緒池的使用
IV. 其他
相關博文
- 報警系統QuickAlarm總綱
- 報警系統QuickAlarm之報警執行器的設計與實現
- 報警系統QuickAlarm之報警規則的設定與載入
- 報警系統QuickAlarm之報警規則解析
- 報警系統QuickAlarm之頻率統計及介面封裝
- 報警系統QuickAlarm使用手冊
專案
- 專案地址: Quick-Alarm
- 部落格地址: 小灰灰Blog
宣告
盡信書則不如,已上內容,純屬一家之言,因本人能力一般,見解不全,如有問題,歡迎批評指正