重試機(jī)制的設(shè)置次數(shù)并沒有固定的標(biāo)準(zhǔn),它可以根據(jù)具體的業(yè)務(wù)需求和目標(biāo) API 的特性來靈活設(shè)定。一般來說,重試次數(shù)設(shè)置為 3 到 5 次是比較常見的選擇。這樣的設(shè)置可以在處理臨時(shí)性故障(如網(wǎng)絡(luò)波動(dòng)、服務(wù)器繁忙等)時(shí)提高 API 調(diào)用的成功率,同時(shí)避免過度重試對(duì)服務(wù)器造成不必要的負(fù)擔(dān)。
在實(shí)現(xiàn)重試機(jī)制時(shí),除了設(shè)置重試次數(shù),還應(yīng)注意以下幾點(diǎn):
重試間隔:設(shè)置合理的重試間隔時(shí)間,如每次重試間隔 1 秒到幾秒不等,可以采用固定間隔或指數(shù)退避策略,以減少對(duì)服務(wù)器的瞬間壓力。
錯(cuò)誤類型判斷:并非所有錯(cuò)誤都適合重試。例如,對(duì)于客戶端錯(cuò)誤(如參數(shù)錯(cuò)誤、權(quán)限不足等4xx狀態(tài)碼),通常不需要重試,而應(yīng)修正請(qǐng)求參數(shù)或檢查權(quán)限設(shè)置。對(duì)于服務(wù)器錯(cuò)誤(5xx狀態(tài)碼)和網(wǎng)絡(luò)錯(cuò)誤,則可以考慮重試。
記錄日志:在重試過程中,記錄詳細(xì)的錯(cuò)誤信息和重試次數(shù),以便于問題排查和后續(xù)分析。
最大重試限制:設(shè)置一個(gè)明確的最大重試次數(shù),當(dāng)達(dá)到這個(gè)限制時(shí),停止重試,并采取其他措施,如記錄錯(cuò)誤日志、向用戶提示失敗信息等。
例如,在淘寶開放平臺(tái)的文檔中提到,當(dāng)遇到服務(wù)器錯(cuò)誤或網(wǎng)絡(luò)問題時(shí),可以在代碼中設(shè)置重試機(jī)制,但要注意重試的次數(shù)和時(shí)間間隔,避免過度重試。同時(shí),淘寶開放平臺(tái)的一些接口在內(nèi)部實(shí)現(xiàn)中也有自己的重試機(jī)制,例如消息推送失敗后的重試策略,其最大重試次數(shù)為12次。這可以作為設(shè)置重試次數(shù)的一個(gè)參考依據(jù),但開發(fā)者應(yīng)根據(jù)自己的具體應(yīng)用場(chǎng)景來調(diào)整這一參數(shù)。
重試間隔怎么設(shè)置比較好?
重試間隔的設(shè)置需要在提高成功率和減少對(duì)服務(wù)器壓力之間找到平衡。以下是一些常見的重試間隔策略及其適用場(chǎng)景:
一、固定間隔重試
固定間隔重試是最簡(jiǎn)單的重試策略,每次重試間隔固定時(shí)間。適用于網(wǎng)絡(luò)波動(dòng)或短暫的服務(wù)器繁忙情況。
示例代碼(Python):

代碼說明:
max_retries:最大重試次數(shù)。
retry_interval:每次重試的固定間隔時(shí)間(秒)。
time.sleep(retry_interval):在每次重試前暫停固定時(shí)間。
二、指數(shù)退避重試
指數(shù)退避重試是一種更智能的重試策略,每次重試間隔時(shí)間逐漸增加,通常采用指數(shù)退避算法。適用于網(wǎng)絡(luò)不穩(wěn)定或服務(wù)器負(fù)載較高的情況,可以有效減少對(duì)服務(wù)器的瞬間壓力。
示例代碼(Python):

代碼說明:
@retry:裝飾器,用于實(shí)現(xiàn)重試機(jī)制。
stop_after_attempt(3):最多重試 3 次。
wait_exponential(multiplier=1, min=4, max=10):指數(shù)退避算法,重試間隔時(shí)間從 4 秒開始,每次重試間隔時(shí)間逐漸增加,最大不超過 10 秒。
response.raise_for_status():如果響應(yīng)狀態(tài)碼不是 200,拋出?HTTPError?異常。
三、隨機(jī)間隔重試
隨機(jī)間隔重試在每次重試時(shí)添加隨機(jī)性,可以減少多個(gè)客戶端同時(shí)重試時(shí)對(duì)服務(wù)器的集中壓力。適用于高并發(fā)場(chǎng)景。
示例代碼(Python):

代碼說明:
min_interval:最小重試間隔時(shí)間(秒)。
max_interval:最大重試間隔時(shí)間(秒)。
random.uniform(min_interval, max_interval):生成一個(gè)在指定范圍內(nèi)的隨機(jī)浮點(diǎn)數(shù)。
time.sleep(retry_interval):在每次重試前暫停隨機(jī)時(shí)間。
四、綜合策略
在實(shí)際應(yīng)用中,可以結(jié)合多種策略,根據(jù)不同的錯(cuò)誤類型和場(chǎng)景靈活調(diào)整重試間隔。例如,對(duì)于網(wǎng)絡(luò)錯(cuò)誤可以采用指數(shù)退避重試,對(duì)于服務(wù)器繁忙可以采用固定間隔重試,對(duì)于高并發(fā)場(chǎng)景可以添加隨機(jī)性。
示例代碼(Python):


代碼說明:
_fetch_data:內(nèi)部函數(shù),使用?tenacity?庫實(shí)現(xiàn)指數(shù)退避重試。
固定間隔重試:對(duì)于服務(wù)器錯(cuò)誤(500, 502, 503),采用固定間隔重試。
隨機(jī)間隔重試:對(duì)于請(qǐng)求過于頻繁(429),添加隨機(jī)間隔重試。
五、總結(jié)
重試間隔的設(shè)置需要根據(jù)具體的業(yè)務(wù)需求和目標(biāo) API 的特性來靈活調(diào)整。以下是一些常見的建議:
固定間隔重試:適用于網(wǎng)絡(luò)波動(dòng)或短暫的服務(wù)器繁忙,間隔時(shí)間通常設(shè)置為 2 到 5 秒。
指數(shù)退避重試:適用于網(wǎng)絡(luò)不穩(wěn)定或服務(wù)器負(fù)載較高,初始間隔時(shí)間通常設(shè)置為 2 秒,最大間隔時(shí)間設(shè)置為 10 秒。
隨機(jī)間隔重試:適用于高并發(fā)場(chǎng)景,最小間隔時(shí)間設(shè)置為 2 秒,最大間隔時(shí)間設(shè)置為 5 秒。
綜合策略:根據(jù)不同的錯(cuò)誤類型和場(chǎng)景,靈活調(diào)整重試間隔,提高成功率,減少對(duì)服務(wù)器的壓力。
通過合理設(shè)置重試間隔,可以有效提高爬蟲的穩(wěn)定性和成功率,同時(shí)避免對(duì)目標(biāo)服務(wù)器造成不必要的負(fù)擔(dān)。希望這些方法和建議能夠幫助你更好地實(shí)現(xiàn)和優(yōu)化重試機(jī)制。