遠程服務調用失敗重試之簡單實現

前言

再業務多、併發高的情況下,我們的系統,一般都會拆分爲多個子系統,子系統之前通過 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

結尾

實際業務中,我們會把調用失敗的操作暫存起來,等其他業務過一遍後。再重複執行,以確保大量的其他業務完成,而不至於卡在一個點上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章