前言
再業務多、併發高的情況下,我們的系統,一般都會拆分爲多個子系統,子系統之前通過 RPC 聯繫。
RPC 調用偶爾會出現失敗的問題,而有些問題實際上不是問題,例如只是網絡延遲,方法調用超時,再試一遍就完事了。
這時候,重試的引入即勢在必行了。
正文
下面寫一個簡單的 demo,模擬遠程服務重試的最簡單實現方式——循環實現
模擬調用遠程服務
重點在於引入 try catch 處理邏輯
package com.cun.retry.client;
import com.cun.retry.service.RemoteService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Test {
private static final int RETRY_TIMES = 3;
private static final Logger logger = LoggerFactory.getLogger(Test.class);
public static void main(String[] args) {
int retryCount = 0;
while (retryCount < RETRY_TIMES) {
try {
RemoteService.execute();
break; // 能執行到這行,說明執行沒有異常
} catch (Exception e) {
retryCount++;
logger.info("【遠程服務調用失敗,重試中】");
}
}
if (retryCount >= RETRY_TIMES){
logger.info("【無法調用遠程服務】");
}
logger.info(String.format("【重試次數:%s >>> 最終執行是否成功:%s】", retryCount, retryCount < RETRY_TIMES));
}
}
模擬遠程的服務方法
有機率 ÷0
引發失敗
package com.cun.retry.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Random;
public class RemoteService {
private static final Logger logger = LoggerFactory.getLogger(RemoteService.class);
public static int execute() {
logger.info("【遠程服務執行中】");
int num = new Random().nextInt(3);
return 10 / num;
}
}
可能結果
完整代碼放在 GitHub 上了:https://github.com/larger5/retry
結尾
實際業務中,我們會把調用失敗的操作暫存起來,等其他業務過一遍後。再重複執行,以確保大量的其他業務完成,而不至於卡在一個點上。