El kit de desarrollo de software (SDK) de Go para Tablestore utiliza excepciones para manejar los errores. Este tema describe cómo Tablestore gestiona los errores, la información que contienen las excepciones y las directivas de reintentos disponibles.
Método
El SDK de Go para Tablestore lanza una excepción cuando ocurre un error. Una llamada a la API se considera correcta si no lanza ninguna excepción; en caso contrario, la operación falló.
Para las operaciones por lotes, como BatchGetRow y BatchWriteRow, compruebe no solo las excepciones, sino también el estado de cada fila. La llamada a la API se considera correcta únicamente cuando todas las filas se procesan correctamente.
Excepciones
Al usar el SDK de Go para Tablestore, generalmente se devuelve una excepción como segundo parámetro del valor de retorno de un método. Por lo tanto, antes de recuperar los datos devueltos, compruebe si el parámetro err tiene algún valor.
Si ocurre un error del lado del servidor en Tablestore, el parámetro err contiene un requestId. El requestId es un identificador único universal (UUID) que identifica la solicitud de forma inequívoca. Si no logra resolver el problema, registre este requestId y envíe un ticket.
A continuación se muestra un ejemplo de código sobre cómo manejar excepciones:
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)
}
}
Reintentos
El SDK de Go proporciona una directiva de reintentos predeterminada. También puede personalizar la lógica de reintentos.
Directiva de reintentos predeterminada
El SDK de Go realiza un reintento con retroceso cuando ocurre un error de limitación o un error interno del servidor durante una operación de lectura. El número máximo de reintentos predeterminado es 10, y la duración total máxima predeterminada para los reintentos es de 5 segundos. Modifique tablestore.TableStoreConfig para establecer los parámetros de la directiva de reintentos predeterminada. En la siguiente tabla se describen estos parámetros.
|
Parámetro |
Descripción |
Valor predeterminado |
|
RetryTimes |
Número máximo de reintentos. |
10 |
|
MaxRetryTime |
Duración total máxima para los reintentos. |
5s |
|
DefaultRetryInterval |
Valor de variación aleatoria para la directiva de reintentos con retroceso exponencial. Esto evita que varios clientes con errores inicien solicitudes de reintento simultáneamente. |
10 ms |
|
MaxRetryInterval |
Intervalo de tiempo máximo entre dos reintentos. |
320 ms |
|
Transport |
Gestiona las propiedades subyacentes de transporte del cliente HTTP. El valor predeterminado es nil. Si establece este parámetro, los parámetros |
nil |
|
HTTPTimeout.ConnectionTimeout |
Tiempo de espera para establecer una nueva conexión de red HTTP. |
15s |
|
HTTPTimeout.RequestTimeout |
Tiempo máximo que un cliente HTTP espera la respuesta del servidor después de enviar una solicitud. |
30s |
|
MaxIdleConnections |
Número máximo de conexiones inactivas para un host HTTP. |
2000 |
|
IdleConnTimeout |
Duración máxima que una conexión inactiva para un host HTTP permanece abierta en el pool de conexiones sin reutilizarse. |
25s |
Lógica de reintentos personalizada
Para modificar la lógica de reintentos predeterminada o crear una lógica personalizada, configure los siguientes parámetros en TableStoreClient.
|
Parámetro |
Descripción |
Valor predeterminado |
|
CustomizedRetryFunc |
Si configura
|
nil |
|
KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc |
true |
Los siguientes ejemplos muestran cómo personalizar la lógica de reintentos:
Reintentar todos los errores
El siguiente ejemplo muestra cómo reintentar ante cualquier error.
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
}
No reintentar ningún error
El siguiente ejemplo muestra cómo deshabilitar los reintentos para todos los errores.
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 en el reintento
Para ejecutar operaciones predefinidas cuando el SDK reintenta una operación, configure el siguiente parámetro en TableStoreClient.
|
Parámetro |
Descripción |
Valor predeterminado |
|
RetryNotify |
Método de callback que se activa cuando el SDK realiza un reintento. |
nil |
El siguiente ejemplo muestra cómo establecer un ID de rastreo del lado del negocio para cada solicitud e imprimir dicho ID cuando ocurre un reintento.
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 continuación se muestra un ejemplo de la salida generada:
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