失敗重試的策略(方法)

失敗重試的策略(方法)

業務中往往會遇到失敗重試的場景,如dubbo調用,默認3次重試,但是有些情況我們不能做重試操作,如被調用的接口不冪等。

正文

樸素方法

樸素就是代碼一把梭,不考慮擴展性,重用性。

// 指定最大重試次數,成功就返回。
for (i = 0; i < retryTimes; i++) {
	try {
        return callback();
    } catch (e) {
    	log.error(e);
    }
}

Dubbo重試

先上代碼:

Reference<xxxApi>.setRetryTimes(3);
xxxApi.doSomeInsert(1);

優勢明顯:內置!簡潔!無侵入!
劣勢明顯:內置重試方法比較固定。

Spring Retry

本來考慮自己寫一個重試框架的,發現spring-retry模塊已經從Spring Batch項目中獨立出來了,一個很小巧的模塊,可以拿來就用。它使用了模板模式:

SimpleRetryPolicy policy = new SimpleRetryPolicy(5);
RetryTemplate template = new RetryTemplate();
template.setRetryPolicy(policy);
template.execute(new RetryCallback<Foo>() {
    public Foo doWithRetry(RetryContext context) {
        // 這裏寫業務代碼
    }
});

如果配合Spring AOP,代碼可以更簡潔:

@Service
class Service {
    @Retryable(RemoteAccessException.class)
    public service() {
        // ... do something
    }
}

優勢巨大:

  1. 任意擴展重試策略(RetryTemplate),容易定義異步重試策略;
  2. 代碼簡潔,堪比dubbo內置;

劣勢:對代碼略有侵入性。

附錄

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