專案裡不同寫入資料場景的解決方案

2021-09-20 12:30:00 字數 1816 閱讀 1942

專案裡會遇到很多共通的場景但沒有乙個規範的解決方案。

下面就以100萬店鋪舉例子,比如要做狀態修改,狀態修改之前需要對店鋪有效性、是否狀態允許修改等校驗,然後再更新。假設查詢校驗每個店鋪需要20ms,更新資料需要100ms。為了保證介面不超時,最多隻允許3s處理請求。

1、店鋪自己對單個店鋪修改狀態:此場景由於只操作了乙個店鋪的資料,可全部使用同步介面,更容易保證資料一致性,服務的處理結果及時,介面處理成功就是成功,失敗就是失敗。

2、連鎖店操作修改1000家店鋪:此場景難度就公升級了,因為無論對1000家店鋪的查詢校驗還是更新都會超時,這時候可採用查詢多執行緒執行,更新mq的形式達到要求。具體做法就是使用乙個執行緒池去分批執行對店鋪的查詢校驗,如果有某個或者某些店鋪不符合要求,可按需求是選擇過濾還是直接打回請求,這裡請求如果介面併發量很低可採用公共執行緒池,否則併發高還是需要採用介面內的執行緒池,防止由於任務等待執行也有可能超時,在通過所有校驗後需要批量更新資料,因為此時由於量大也會超時,這時不建議使用多執行緒執行,因為可能會由於發布等操作導致更新丟失,採用mq分發請求,非同步完成更新操作,通過mq去保證資料一致性、完整性。

3、運營10萬+的店鋪資料更新:這時候同步查詢校驗已經不現實了,因為千級的採用多執行緒去查詢校驗還湊合能完成,到了10萬+的時候多執行緒也滿足不了,這時候需要完全採用mq非同步去操作,先跟產品約定好預設的處理邏輯,至於處理結果可能儲存到db供後期查詢。

4、全量店鋪資料定時更新:這個很明顯的定時任務特性,可採用定時任務慢慢更新資料,但是如果對時間有要求可將任務拆分,分布在不同機器呼叫,甚至可以採用mq分發到整個集群去處理。

自營銷活動:此場景出現在單店店鋪上活動,店鋪資料量為1,商品資料量可以限定一定範圍(1-100),可以通過同步呼叫返回校驗結果,並且同步呼叫批量繫結菜品介面寫入資料。因為活動關係和庫存有可能因為不在乙個庫或者其他原因導致底層不能保證事務,保證資料一致性,這時候可採用同步呼叫之餘try catch異常,用非同步發mq的形式補償資料,要求上活動介面冪等。

連鎖店和bd直上活動:此場景時單次請求同步處理已經不現實了,大批量的操作妥妥的會導致超時,這時候引入執行緒池,通過執行緒池提交任務,完成對所有店鋪的校驗,包括活動衝突,商品是否符合活動要求等,等所有校驗都通過了這時候可以通過mq分發去完成上活動的操作,這裡使用mq不用多執行緒一方面是考慮資料更新在發布丟失,一方面更加把處理分布到整個集群裡,而且由於上活動會依賴外部介面,而外部介面的可用性也會出現異常,通過mq的ack機制可保證資料最終一致性。

招商活動:此場景所有同步都用不了了,到了10萬+的地步,效能再好的介面也無法滿足量級的爆發,這時候在設計系統的時候,可以將所有需要處理的資料拆分成10或者100個一組的mq訊息,為什麼要拆呢?因為後面的寫入資料時速度太快了db壓力大,寫入速度慢了訊息消費不了又會堵mq。處理結果可以通過非同步寫入資料庫等儲存下來,因為是非同步處理,只需要定好處理邏輯即可,比如如果店鋪不存在怎麼辦:丟掉,店鋪是新零售店鋪怎麼辦:丟掉。因為招商活動也有特殊的地方,因為量大,所以需要看一下活動的效果,這個做成t+1的話運營可能無法接受,所以將所有招商推送的資料和報名資料同步到了es,通過es更高效的查詢統計完成對活動資料的實時統計,同時也避免了對db大表的頻繁大量資料的count。

菜品的解鎖、鎖定:這個場景原先是在業務**裡通過同步呼叫的方式去完成對菜品的解鎖和鎖定,非常繁瑣,而且很容易出問題,只要向菜品那邊更新狀態失敗,也不會重試,大量不同上活動、作廢、審核等流程都需要接入鎖定和解鎖的方法,相當麻煩,如果活動到期了菜品沒被解鎖還很容易導致被投訴,這個問題的投訴量原先是居高不下的。重新設計後採用活動關係表drc訊息和審核邏輯驅動,通過活動關係表的狀態變更判斷菜品是否需要解鎖、鎖定。審核資料也可以這麼做,後期會優化。再通過將鎖定和解鎖轉化成乙個個task,通過狀態判定執行的結果成功與否,之所以再轉化task,主要是為了不停的重試和防止短時間內重試太多次。

Oracle 寫髒資料的不同場景

checkpoint會觸發dbwr寫髒塊時是根據checkpoint queue來的,而lru w是負責dbwr的其他寫出條件的觸發。如下的情況下,會觸發dbwr程序將髒塊寫出到disk 1 當程序掃瞄lru鍊錶查詢可用buffer 可用被覆蓋的 buffer header 的時候,如果已經被掃瞄的...

InfluxDb中寫入重複資料問題解決方案

1.influxdb版本 0.10.3 2.measurement todaychargetimereport 只有time和field列,沒有tag列 3.現象 通過定時任務向上面的表中寫入資料 var point new point point.measurement todaychargeti...

vue裡不同資料的迴圈,其中的陣列物件

用產品的屬性資料說明 頁面裡顯示效果為 要把產品的屬性顯示到頁面上,產品屬性為後台自主上傳產品的屬性,產品的屬性不同,所以需要把屬性和屬性值顯示到頁面上 產品屬性資料為 properties html 為 全部 1.重點記錄一下類似於jquery中的key 與 value的顯示 以下是vue的寫法 ...