場景:
君寧天下大飯堂,每天有1-2萬的人數去喫飯,喫飯只能在線點單,如果用戶喫完飯N天內沒有評價,系統則會默認好評
數據庫:
訂單列表
userid(用戶id),ordertime(下單時間),IsEvaluate(是否評價)
主要思路:
base:系統內,做個定時查詢,根據ordertime(下單時間)判斷是否超過七天,然後修改 IsEvaluate(是否評價)
注意事項:
以爲是每天以最少1-2萬量級的數據增加,因此表的體量很大,且積累的會越來越多(暫不考慮清楚or移植舊數據),對錶進行如此大的查詢注意系統以及數據庫性能是否會對其產生影響,系統線上部署是集羣方式
解決方案:
公司主管大人:將業務邏輯用sql腳本方式實現,系統程序調用sql腳本執行處理,使用Windows自帶的定時任務功能調用api
個人分析:程序壓力轉移給數據庫,讓數據庫承擔這個壓力,減少程序的性能消耗,缺點是加大了數據庫性能消耗
我在公司寫的:業務邏輯在程序內部實現,先查出符合條件的數據,再遍歷賦值 (本分析文章場景簡化了些許,實際上還要做其他修改,所以要遍歷),最後保存到數據庫,使用Windows自帶的定時任務功能調用api
個人分析:系統程序主要承擔壓力,但可能造成資源消耗過多,從而影響系統其他功能,增加系統負載,因爲是集羣,所以系統程序與數據庫資源都浪費嚴重
我知識範圍內想到的最優方案:每次下單,產生訂單數據的同事,向隊列(rocketMQ,redisMQ,RabbitMQ等隊列)中插入一條數據,單獨部署一個程序每天定時掃描隊列,執行邏輯判斷,符合條件則進行修改數據庫
個人分析:將數據寫入隊列,減輕對數據庫的性能消耗,減少程序頻繁訪問數據庫帶來的壓力。單獨部署程序掃描隊列,不會影響主系統。缺點是需要多部署個程序和隊列服務,且隊列有丟失數據風險
業界前輩方案:
1、延遲隊列
2、數據庫定時執行腳本