什麼是請求重放
- 由於網路原因或未知異常導致的客戶端不斷向服務端重試同一個請求的行爲可以叫做請求重放。
可能導致的問題
- 請求重放可能會導致出現的一些問題有:數據重複、數據不一致、服務端接口被惡意攻擊直至崩潰。
常見的業務場景
- 分佈式場景下,使用dubbo框架,dubbo微服務間接口請求處理響應超時後,調用方默認會發起請求重試;
常見的解決方案
- 加隨機數。
- 加時間戳。
- 加流水號
基於redis實現的一種解決方案(隨機數原理)
- 根據 參數、方法名全路徑 進行格式化成json串,然後對json串進行md5加密,得到md5隨機數;
- 將得到的md5隨機數作爲key,去redis中判斷該key是否存在?
- 如果存在說明是重複請求;
- 如果不存在說明不是重複請求,將該key放到redis中,設置超時時間(按實際業務來定);
- 注意:設置key要使用redis樂觀鎖方式,因爲在設置key的時候可能會存在併發問題:比如兩個相同參數的請求同時進來,都判斷redis中沒有key,都認爲是重複請求,則會被處理兩次
- 注意:這個方案實現中,接口參數中一定也要包含一個隨機數參數,否則參數很可能會是重複的呀,我們進行md5加密其實主要是想減短redis key的長度大小,因爲參數可能很長,這個不容易把控。