Tablestore的SDK如何配置自定义重试

当我们的应用服务遇到网络抖动、服务端进行分区分裂等问题时候,会出现请求超时或者失败。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

  1. 设置网络相关的一些参数
  2. 实现自定义重试函数。可以根据errorCode、errorMsg、action、httpStatus等信息判断要不要进行重试。
  3. 在构造好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
}

上一篇:Tablestore入门手册--表(Table)管理


下一篇:十款非常优秀的 HTML5 在线设计工具