O kit de desenvolvimento de software (SDK) Go do Tablestore usa exceções para tratar erros. Este tópico descreve como o Tablestore lida com falhas, as informações contidas nas exceções e as políticas de nova tentativa disponíveis.
Método
O SDK Go do Tablestore lança uma exceção quando ocorre um erro. Uma chamada de API é bem-sucedida se não lançar exceções. Caso contrário, a operação falhou.
Para operações em lote, como BatchGetRow e BatchWriteRow, verifique não apenas as exceções, mas também o status de cada linha. A chamada de API só terá sucesso completo quando todas as linhas forem processadas corretamente.
Exceções
Ao usar o SDK Go do Tablestore, uma exceção geralmente é retornada como o segundo parâmetro do valor de retorno de um método. Portanto, antes de recuperar os dados retornados, verifique se o parâmetro err possui algum valor.
Se ocorrer um erro no lado do servidor no Tablestore, o parâmetro err conterá um requestId. O requestId é um identificador universalmente único (UUID) que identifica a solicitação de forma exclusiva. Se você não conseguir resolver o problema, registre esse requestId e envie um ticket.
O código a seguir exemplifica o tratamento de exceções:
client := tablestore.NewClient(endpoint, instanceName, accessKeyId, accessKeySecret)
listTables, err := client.ListTable()
if err != nil {
// Handle the exception.
fmt.Println(err.Error())
} else {
// No exception.
for _, table := range listTables.TableNames {
fmt.Println("TableName: ", table)
}
}
Novas tentativas
O SDK Go oferece uma política padrão de novas tentativas. Você também pode personalizar a lógica de repetição.
Política padrão de novas tentativas
O SDK Go executa uma nova tentativa com backoff quando ocorre um erro de limitação ou um erro interno do servidor durante uma operação de leitura. O número máximo padrão de tentativas é 10, e a duração total máxima padrão é de 5 segundos. Modifique tablestore.TableStoreConfig para definir os parâmetros da política padrão. A tabela a seguir descreve esses parâmetros.
|
Parâmetro |
Descrição |
Valor padrão |
|
RetryTimes |
Número máximo de novas tentativas. |
10 |
|
MaxRetryTime |
Duração total máxima para as tentativas. |
5s |
|
DefaultRetryInterval |
Valor de jitter para a política de backoff exponencial. Isso impede que vários clientes com falha iniciem solicitações de nova tentativa simultaneamente. |
10 ms |
|
MaxRetryInterval |
Intervalo de tempo máximo entre duas tentativas. |
320 ms |
|
Transport |
Gerencia as propriedades subjacentes de transporte do cliente HTTP. O valor padrão é nil. Se você definir este parâmetro, os parâmetros |
nil |
|
HTTPTimeout.ConnectionTimeout |
Tempo limite para estabelecer uma nova conexão de rede HTTP. |
15s |
|
HTTPTimeout.RequestTimeout |
Tempo máximo que um cliente HTTP aguarda por uma resposta do servidor após enviar uma solicitação. |
30s |
|
MaxIdleConnections |
Número máximo de conexões ociosas para um host HTTP. |
2000 |
|
IdleConnTimeout |
Duração máxima que uma conexão ociosa para um host HTTP permanece aberta no pool de conexões sem ser reutilizada. |
25s |
Lógica personalizada de novas tentativas
Para alterar a lógica padrão ou criar uma lógica personalizada de novas tentativas, defina os seguintes parâmetros para TableStoreClient.
|
Parâmetro |
Descrição |
Valor padrão |
|
CustomizedRetryFunc |
Se você definir
|
nil |
|
KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc |
true |
Os exemplos a seguir mostram como personalizar a lógica de novas tentativas:
Repetir todos os erros
Este exemplo demonstra como tentar novamente diante de qualquer erro.
func alwaysRetry(errorCode string, errorMsg string, action string, httpStatus int) bool {
return true
}
func main() {
client := tablestore.NewClient(endpoint, instanceName, accessKeyId, accessKeySecret)
client.CustomizedRetryFunc = alwaysRetry
// do something
}
Não repetir nenhum erro
O exemplo abaixo ilustra como desativar novas tentativas para todos os erros.
func alwaysNotRetry(errorCode string, errorMsg string, action string, httpStatus int) bool {
return false
}
func main() {
client := tablestore.NewClient(endpoint, instanceName, accessKeyId, accessKeySecret)
client.CustomizedRetryFunc = alwaysNotRetry
client.KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc = false
// do something
}
Callback em nova tentativa
Para executar operações predefinidas quando o SDK repetir uma operação, defina o seguinte parâmetro para TableStoreClient.
|
Parâmetro |
Descrição |
Valor padrão |
|
RetryNotify |
Método de callback acionado quando o SDK executa uma nova tentativa. |
nil |
O exemplo a seguir mostra como definir um ID de rastreamento do lado da aplicação para cada solicitação e imprimir esse ID quando ocorrer uma nova tentativa.
func userRetryNotify(traceId, requestId string, err error, action string, backoffDuration time.Duration) {
// Custom logic that is invoked when a retry is triggered.
fmt.Println("Retry for traceId: " + traceId + ", timestamp: " + strconv.FormatInt(time.Now().UnixNano(), 10))
}
func alwaysRetry(errorCode string, errorMsg string, action string, httpStatus int) bool {
return true
}
func main() {
client := tablestore.NewClient(endpoint, instanceName, accessKeyId, accessKeySecret)
client.CustomizedRetryFunc = alwaysRetry
client.RetryNotify = userRetryNotify
request := &tablestore.DescribeTableRequest{TableName: "tableNotExist"}
// Set the business-side trace ID for the request.
request.ExtraRequestInfo.SetTraceID("test_TraceId_" + strconv.FormatInt(time.Now().UnixNano(), 10))
// do something
res, err := client.DescribeTable(request)
if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println(res.ResponseInfo.RequestId)
}
}
A saída a seguir serve como exemplo:
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097752655394000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097752683437000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097752708603000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097752760519000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097752814590000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097752916539000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097753110943000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097753454311000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097753798531000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097754165411000
OTSObjectNotExist Requested table does not exist. 0006143b-fdd6-5050-10ef-700b045590fc