讀寫分離遇到的問題與解決方案總結

2022-03-23 04:38:23 字數 1352 閱讀 8787

1.readonly標記問題:外部查詢介面需標記唯讀,而內部事務內方法呼叫則不能標記,但都混雜在一起如何區分

解決方案:dubbo請求入口處標記,如自定義filter織入標記

2.主從延時導致過期資料載入到快取問題

解決方案:快取標記主庫變更,主從延時期間(目前暫定一分鐘,由於現在提前標記,可能需要延長)內從主庫載入資料

3.主庫發生變更到標記本次變更的間隙期間讀請求從從庫載入過期資料問題

解決方案:提前標記結合資料載入前後版本號檢查,使用過期資料重建快取的概率幾乎為零,詳見下文4和5的解決方案

4.快取覆蓋問題:查詢變更標記到設定快取間隔期間(例如從庫慢查詢延時較長)主庫資料發生變更,從從庫載入的過期資料覆蓋快取,類似的還有主庫段時間內頻繁變更多次,而多執行緒查詢時,先查找到中間狀態的資料後返回,最終覆蓋快取

解決方案:公升級快取的主庫變更標記為版本號,載入資料前查詢一次版本號,從資料庫load完資料後再檢查一次版本號(此次版本號為空例外,其標誌版本號過期,資料庫未發生變更),如果兩者不一致,說明資料載入期間有過變更,則本次資料不更新到快取

5.載入過期快取且不會被刪除問題:目前程式中有大量事務內刪快取操作,導致刪除快取操作在資料變更之前(因為此時事務尚未提交),事務提交前若有查詢請求重建快取,那麼事務提交後主庫資料發生變更,但是快取將不會被刪除,仍是過期資料

解決方案:aop切入事務標籤方法,使用本地執行緒收集事務內刪除快取的key,此處不做物理刪除,但提前公升級變更標記版本號(阻斷主庫變更和標記變更間隙查詢,由於是提前標記,應該考慮延長標記過期時間,因為標記與資料庫實際發生變更之間有可能存在較長延時),事務結束後再刪除快取

6.事務註解無章法配置可能導致方案5失效從而引發資料一致性問題:

專案中存在大量事務標記有@transactional(rollbackfor = exception.class )(checked異常回滾配置)也有@transactional (預設checked異常不回滾)還有各種巢狀組合,有的還會將unchecked異常包裝成checked異常(如quarkexception),這樣會導致本該回滾的unchecked異常由於被包裝且配置不當而沒有回滾(該問題需要case by case梳理,工作量較大,在時間不允許的情況下後續版本優化),並且在方案5中會導致舊快取由於拋異常而沒有被刪除,但是事務卻提交了資料庫發生變更,從而引發資料一致性問題

7.多層事務巢狀且內層是propagation_requires_new型別事務場景下,存在部分快取需提前刪除的情況,且不能刪除外層事務收集的快取問題:

解決方案:開闢獨立的事務空間,且外層事務可自由獲取記憶體事務的快取(相當於包含關係),這樣propagation_requires_new事務提交時,可僅僅刪除其自身空間以及其可包含的空間內的快取資料,對其外層空間不影響

前後端分離的問題與解決方案

這些天專案有的api出現版本控制問題,著實忙乎了一小陣,因為專案使用tp5的傳統方法進行版本控制 api目錄下進行版本區分,由請求路徑決定使用的版本 但是問題往往是,專案使用了v2版本,但是後端又新建了v3,而前端不知情,所以也趁著這次機會,探索了較為實用的前後端分離問題與解決方案,並做整理。1.後...

遇到的問題及解決方案

這篇筆記,主要記錄學習過程中遇到的一些問題,以及在網上找的相應的解決方案!希望能提醒自己別老是犯相同的錯誤。9.24 問題描述 我新建了乙個實體資料模型,編譯報錯說未能找到實體模型的命名空間,發現model.designer.cs檔案變成空的了,變成 解決方案 為了解決這個問題,你必須把它轉成乙個基...

iviewUI使用中遇到的問題與解決方案(二)

1 列表中使用switch時在切換狀態時用到攔截彈框,要使用原生事件 click.native 2 datepicker 使用校驗的話,繫結資料不能用 value,而要用v model,前者校驗有問題。3 icon新增事件 click.native fn 4 在返回選項時,是否將 label 和 v...