失敗重試的策略(方法)
業務中往往會遇到失敗重試的場景,如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
}
}
優勢巨大:
- 任意擴展重試策略(RetryTemplate),容易定義異步重試策略;
- 代碼簡潔,堪比dubbo內置;
劣勢:對代碼略有侵入性。