近期做項目時遇到一個場景,是需要在后端任務執行時動態注入策略。具體而言,筆者負責的后端服務,可以理解是會在線上服務發布時,對服務風險做實時掃描,那么這個掃描就需要根據當前線上服務發布上下文,匹配對應的策略。但這里掃出來的策略都是靜態持久化的,前端也有產品化的配置,而有些業務則希望能夠在任務執行時,動態注入一些業務自己理解需要的掃描策略,不在前端做靜態配置。
對于這類定制化需求,筆者想到的一種比較低成本實現的方式是這樣的:
首先這類動態生成的策略還是需要持久化的,但不需要在前端做產品化,只不過后端查配置的時候,能夠根據一定的邏輯識別出來哪些策略是靜態配置,哪些策略是動態生成。具體的識別邏輯怎么做,一個解法就回溯到剛進大學學計算機網絡那個年代,IP是怎么劃分的,那么動態策略的ID就可以怎樣劃分。
然后是選數值段,這里需要確保db里面id范圍和內存里面數據類型是一致的,比如mysql的bigint可以對應上Golang里面int64,那么就確保不會出現數值的隱式轉換。然后我們就可以像IP劃分一樣,給一個非常大的prefix(比如0x1234567800000000)以及一個mask(對應的是0x7FFFFFFF00000000),那么只要有一個ID,就可以根據prefix和mask判斷這個ID是動態策略的還是靜態策略的,并且有了prefix,動態策略ID和落庫主鍵ID也可以相互轉化。
最后對于整個系統,根據ID去CRUD執行策略的邏輯都需要做變換,需要先校驗是動態策略還是靜態策略,然后再走對應的分支邏輯。否則會出現問題。