企業級自定義表單引擎解決方案(九)--緩存設計


  新年伊始,萬物皆生機,然冠未去,美帝相向,於華夏之子,吾輩當自強。

  緩存對於任何一個系統來說,都是繞不開的一個話題,緩存設計好了對系統整體的性能往往是指數級的提升,但如是設計不好,對系統的穩定性和性能都是災難性的影響,並直接影響系統整體的架構設計,這篇文章主要對自定義表單后端部分緩存的設計進行討論,但緩存部分的設計思想並不限於自定義表單,其他類似的系統都可以進行參考。

  對於自定義表單來說,緩存比一般的系統依賴性更高,自定義表單定義產生的數據完全滿足更新極少,查詢極高的應用場景。可以想象,一個系統交付給客戶之后,哪些情況還會重新發布,對於傳統的項目,一般一年也沒有幾次,但是自定義表單時時刻刻都在查詢,界面任何一個動作,都需要讀取自定義表單數據的進行支撐,所以緩存對於自定義表單來說顯得更加的重要,說到緩存,多數人第一印象就是Redis等緩存服務器,但自定義表單的緩存我這里的設計完全不依賴於外部緩存服務器,緩存部分的設計有別於其他系統的緩存設計。

先看一張實際效果圖:

 

先說一下緩存部分的總體思想,然后再分析具體的代碼實現。

  1. 自定義表單產生的數據匯總到表單和視圖實體中(表單和視圖的設計參考之前文章介紹),包括相關的控件、規則、行列數據、查詢定義、界面控件樣式等,都聚合到表單或視圖中,表單和視圖都會包含Id和Version字段,任何相關數據的變更,都會同步更新視圖或表單數據,同時重新生成Version值。
  2. 將表單和視圖實體的所有數據存儲經過精簡字段后存儲到內存中(只存儲邏輯上需要的字段。之所以選擇存儲到內存中,是因為自定義表單任何功能都需要讀取定義數據,如果存儲到Redis等外部緩存服務器,對外部服務器的訪問量會非常大,且自定義表單數據定義往往不是幾個字符,是很多數據聚合起來的,數據量相對來說比較大,且有些業務邏輯需要關聯查詢等,所以放到外部緩存服務器並不是可行的方案,所以這里選擇存儲到內存中),並以Dictionary<Id,實體>的方式開放接口訪問,並按照應用模塊來區分,相當於整個自定義表單的定義數據全部存儲到內存中,會用到一些內存,但不會特別大,初步算了一下,100個頁面,存儲占用不會超過20M,對於現代服務器來說,不存在太大的問題。
  3. 自定義表單任何定義數據的更新,都會涉及到緩存的更新,對於單應用服務器不會存在任何的問題,但如果分布式部署的話就會引申出分布式緩存同步更新的問題,如果用獨立的緩存服務器,也不會存在同步更新的問題,但這里的自定義表單緩存存儲在應用服務內部,那么就需要借助於分布式的消息發布訂閱功能的服務,自定義表單數據變更,發布變更通知,部署的自定義表單服務器訂閱通知,收到變更通知時清楚自生內存緩存數據,等待讀取緩存數據時,再從數據庫讀取數據更新緩存。分布式發布訂閱的服務很多,可以選擇Redis或者Rabbitmq等,這里的發布訂閱可以不用是可靠的發布訂閱。另外還需要處理發布訂閱服務器斷開問題,發布訂閱服務器斷開后,所有數據都直接讀取數據庫數據,這個時候應用系統會非常緩慢(解決方案?)。
  4. 前端訪問每個自定義表單頁面,讀取表單關聯的表單和視圖數據,存儲到IndexDb中,以KeyValue的形式存儲,每請求一個頁面,判斷IndexDb中是否存在表單數據,存在時,將關聯的表單Id和視圖Id及其版本號傳到后端,后端判斷版本號是否與后端緩存的版本號一致,如果不一致,將最新的數據返回到前端,前端刷新IndexDb數據,然后再渲染數據。
  5. 前端每請求自定義表單后端接口數據時,將進入界面關聯的表單Id和視圖Id及其版本號寫入Header,后端調用接口前進行攔截,判斷版本號是有存在過期的情況,如果存在過期,則通知用戶刷新界面,重新走加載頁面判斷版本號邏輯。這部分就是效果圖看到的效果。

 

 

 

 

 

  自定義表單緩存設計的部分基本就介紹完了,還是涉及到比較多的邏輯點,這一塊也是自定義表單的重點之一,整體來看,相對於傳統方式開發的應用系統,性能上會有一些損失,但完全可以忽略,這部分內容有別於常規的緩存設計,但里面的一些設計思想還是可以應用到其他系統中,希望對於讀者來說有一些用處。

  自定義表單的系列文章比較偏向於介紹設計思想,不是那么好閱讀,干貨比較多,這篇文章也主要介紹設計思路,下一篇文章具體再介紹一下代碼的實現,謝謝你的閱讀。

 

開源地址:https://gitee.com/kuangqifu/sprite

體驗地址:http://47.108.141.193:8031(首次加載可能有點慢,用的阿里雲最差的服務器)

自定義表單文章地址:https://www.cnblogs.com/spritekuang/

流程引擎文章地址:https://www.cnblogs.com/spritekuang/category/834975.html(采用WWF開發,已過時,已改用Elsa實現,https://www.cnblogs.com/spritekuang/p/14970992.html )

Github地址:https://github.com/kuangqifu/CK.Sprite.Job


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM