O Tablestore SDK for Go trata erros como exceções. Este tópico descreve os métodos de tratamento de erros e as políticas de nova tentativa do Tablestore SDK for Go.
Métodos
O Tablestore SDK for Go gerencia erros na forma de exceções. Uma operação é considerada bem-sucedida quando não gera exceção. Caso contrário, a falha na execução indica que a operação não foi concluída com êxito.
Operações em lote, como BatchGetRow e BatchWriteRow, só têm sucesso quando o sistema confirma a ausência de exceções e o status bem-sucedido de cada linha individualmente.
Exceções
Ao utilizar o Tablestore SDK for Go, o parâmetro err é retornado como segundo parâmetro na resposta. Verifique se há valor no parâmetro err antes de processar os resultados da operação.
Se ocorrer um erro no servidor, o parâmetro err retornará um requestId. Esse ID corresponde ao UUID usado para identificar a requisição. Caso o problema persista, registre o valor do parâmetro requestId e envie um ticket.
O exemplo de código a seguir demonstra o tratamento de erros:
client := tablestore.NewClient(endpoint, instanceName, accessKeyId, accessKeySecret)
listTables, err := client.ListTable()
if err != nil {
// Handle exceptions.
fmt.Println(err.Error())
} else {
// No exceptions.
for _, table := range listTables.TableNames {
fmt.Println("TableName: ", table)
}
}
Novas tentativas
O Tablestore SDK for Go inclui uma política padrão de nova tentativa. Também é possível definir políticas personalizadas conforme sua necessidade.
Política padrão de nova tentativa
Diante de erros de limitação ou falhas internas do servidor em operações de escrita, o Tablestore SDK for Go executa automaticamente até 10 novas tentativas em 5 segundos, aplicando backoff exponencial. Para alterar os parâmetros padrão, configure tablestore.TableStoreConfig. A tabela abaixo detalha esses parâmetros.
|
Parâmetro |
Descrição |
Valor padrão |
|
RetryTimes |
Quantidade máxima de novas tentativas. |
10 |
|
MaxRetryTime |
Tempo máximo permitido para a execução das tentativas. |
5s |
|
DefaultRetryInterval |
Valor de variação (jitter) para o backoff exponencial, evitando requisições simultâneas de múltiplos clientes. |
10 ms |
|
MaxRetryInterval |
Intervalo máximo entre duas tentativas consecutivas. |
320 ms |
|
Transport |
Atributo de transporte para clientes HTTP. Valor padrão: nil. Ao especificar este parâmetro, as configurações HTTPTimeout.ConnectionTimeout, MaxIdleConnections e IdleConnTimeout perdem o efeito. |
nil |
|
HTTPTimeout.ConnectionTimeout |
Tempo limite para estabelecer uma conexão HTTP. |
15s |
|
HTTPTimeout.RequestTimeout |
Tempo de espera pela resposta do servidor. |
30s |
|
MaxIdleConnections |
Número máximo de conexões ociosas mantidas. |
2000 |
|
IdleConnTimeout |
Período máximo que um host pode permanecer ocioso no pool de conexões. |
25s |
Lógica personalizada de nova tentativa
É possível ajustar a lógica padrão ou implementar uma estratégia própria configurando os seguintes parâmetros em TableStoreClient. Consulte a tabela abaixo para mais detalhes.
Parâmetro | Descrição | Valor padrão |
CustomizedRetryFunc | Ao definir
| nil |
KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc | true |
Exemplo de lógica personalizada de nova tentativa:
Repetir todas as requisições com falha
Código de exemplo para repetir todas as requisições que falharam:
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 nenhuma requisição com falha
Código de exemplo para desativar novas tentativas em caso de falha:
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
}
Configure callbacks de nova tentativa
Para executar ações predefinidas durante uma nova tentativa, configure o seguinte parâmetro em TableStoreClient. Veja a descrição na tabela abaixo.
|
Parâmetro |
Descrição |
Valor padrão |
|
RetryNotify |
Callback acionado durante uma nova tentativa. |
nil |
O código abaixo ilustra como defina um traceID para cada requisição e exibi-lo quando ocorrer uma nova tentativa.
func userRetryNotify(traceId, requestId string, err error, action string, backoffDuration time.Duration) {
// Configure the retry callback.
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 traceID of 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)
}
}
Resposta de 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