背景
最近接到一個需求,業務數據表中有三張表,只想保留最近365天的數據,過期的就刪除,避免這些沒有太大意義的數據造成數據表越來越大。
當時想了兩種解決方案:
方案一
利用mysql
的event
事件機制,通過寫sql腳本,可以很快的完成這個需求,優點很明顯:
- 快速實現,時間成本低
- 不需要再引入什麼亂七八糟的東西或者代碼
但是,也有很明顯的缺點:
- 沒有日誌啊,怎麼知道有沒有跑,成沒成功呢
- 只能定時跑,不能人工觸發,也沒法做管理
方案二
當時出現在腦海裏的第二個思路就是直接利用現有代碼裏面的ScheduledTask
,寫點java代碼就把這個需求給搞了,這樣的話日誌也有了,加個controller連手動觸發也有了,再積極點,搞個異常告警什麼的也不是事。
然而,這樣真的好嗎?這次是要清三個表,就寫三個定時任務,三段sql,下次再加個表,再加代碼上線?好累啊,有沒有更好點的方式呢?
方案三
所以就乾脆自己寫個工具算了,期望是以後有類似的需求就別再開發了。
總的來說,設計思路是這樣的:
- 使用
SpringBoot
快速開發一個Web應用 - 啓動的時候讀配置文件,使用
quartz
加載定時任務 - 配置文件裏面配置了清理的時間(
cron表達式
)、數據庫url
、用戶名
、密碼
、要清理的庫名
、表名
、清理依賴的字段
、保存時間
- 定時任務執行的時候,根據配置文件的配置,創建鏈接,拼裝清理的sql語句,然後執行,執行完關閉鏈接
通過上面的設計,一是能夠滿足這次的需求,二是以後有類似的數據清理需求的時候,可以不用再做代碼開發了,改改配置就好了,三是以後可以方便的做拓展,比如,加入zookeeper,就可以做分佈式任務協調,加個頁面,就可以頁面操作和管理所有的清理任務,想簡單點的話,有類似需求的項目可以自己一行命令運行這個工具類,想得複雜一點,可以加入不同的清理對象,使得不僅僅支持Mysql,然後可以搭建一個平臺類項目,不同項目的數據清理需求都可以在這裏維護管理…
當然,我想多了,其實就是完成這麼一個簡單的需求而已。
那麼有沒有其他方案呢?我想也有的,引入個分佈式調度框架,然後寫個清理腳本,用人家成熟的產品來做這個活兒嘛,但是想想好像更重了。
附上github
地址:https://github.com/DevotedTangLiu/data-clean-util