当我们的应用服务遇到网络抖动、服务端进行分区分裂等问题时候,会出现请求超时或者失败。Tablestore的SDK里默认配置支持一些基本的重试逻辑,但是并不能满足所有业务,因此这里介绍一下常见语言的SDK中如何自定义进行重试。
JAVA
构造Client,传入指定的重试策略。
ClientConfiguration clientConfiguration = new ClientConfiguration();
RetryStrategy retryStrategy = new AlwaysRetryStrategy(10, 1000);
clientConfiguration.setRetryStrategy(retryStrategy);
SyncClient client = new SyncClient("endpoint", "accessId", "accessKey", "instanceName", clientConfiguration);
默认的重试策略,写入操作是不会进行重试的,如果写入也是幂等的,那么可以使用如上所示的AlwaysRetryStrategy重试策略,指定最大重试次数和最大重试间隔(重试间隔会指数增长到最大重试间隔)即可。
当然还可以自定义重试策略:只需要实现RetryStrategy接口即可,自己通过判断action和Exception类型,可以实现哪些异常进行重试,哪些API可以进行重试,具体可以参考RetryStrategy的源码说明以及DefaultRetryStrategy中的实现逻辑
GO
- 设置网络相关的一些参数
- 实现自定义重试函数。可以根据errorCode、errorMsg、action、httpStatus等信息判断要不要进行重试。
- 在构造好client后设置该client的重试策略。
// 设置网络相关的一些参数
var myConfig = &tablestore.TableStoreConfig{
RetryTimes: 10,
HTTPTimeout: tablestore.HTTPTimeout{
ConnectionTimeout: time.Second * 15,
RequestTimeout: time.Second * 60},
MaxRetryTime: time.Second * 10,
MaxIdleConnections: 2000,
}
// 自定义重试函数
func MyRetryFunc(errorCode string, errorMsg string, action string, httpStatus int) bool {
// 如果想要所有都重试,直接返回true
if strings.Contains(errorCode, "OTSOperationConflict") || strings.Contains(action, "Search") || strings.Contains(action, "PutRow") {
return true
}
return false
}
// 构造自己的client
func newMyClient(endpoint string, instanceName string, accessKeyId string, accessKeySecret string) *tablestore.TableStoreClient {
var myClient = tablestore.NewClientWithConfig(endpoint, instanceName, accessKeyId, accessKeySecret, "", myConfig)
myClient.CustomizedRetryFunc = MyRetryFunc
return myClient
}