Se ocorrer timeout de requisição ou erro interno no servidor durante a chamada da API do Resource Orchestration Service (ROS), o cliente pode tentar reenviar a requisição. Nesse caso, especifique o parâmetro ClientToken na requisição para evitar envios repetidos pelo cliente.
O que é idempotência?
A idempotência é uma propriedade de certas operações e recursos na matemática e na ciência da computação. Ela garante a obtenção do mesmo resultado da requisição inicial, mesmo após executar a operação ou aplicar o recurso várias vezes. Esse conceito é fundamental no design de sistemas distribuídos.
Garantir idempotência
Geralmente, o cliente envia uma nova tentativa de requisição quando o código de status HTTP retornado é 500 Internal Server Error ou 503 Service Unavailable, ou quando não há retorno de resultado. Ao chamar a API do ROS, defina um parâmetro para que o cliente gere uma string de até 64 caracteres ASCII. Use essa string como valor do parâmetro ClientToken para assegurar a idempotência da requisição de nova tentativa.
ClientToken
As informações a seguir descrevem o parâmetro de requisição ClientToken:
O valor do parâmetro ClientToken é uma string única, sensível a maiúsculas e minúsculas, gerada pelo cliente com até 64 caracteres ASCII. Exemplo:
ClientToken=123e4567-e89b-12d3-a456-42665544****.-
Se uma requisição de nova tentativa contiver o mesmo valor de ClientToken da requisição inicial, mas apresentar valores diferentes em outros parâmetros, o ROS retornará o código de erro
InvalidIdempotenceParameter.NotaAltere os valores dos parâmetros
SignatureNonce
,
Timestamp
e
Signature
em cada requisição de nova tentativa. Na API do ROS, o parâmetro
SignatureNonce
evita ataques de replay, enquanto o parâmetro
Timestamp
registra o horário de cada requisição. Portanto, os valores de
SignatureNonce
e
Timestamp
devem ser diferentes dos usados na requisição original. Por padrão, o valor do parâmetro
Signature
muda automaticamente ao alterar os valores de SignatureNonce e Timestamp.
-
Ao definir o parâmetro ClientToken em uma requisição de nova tentativa, podem ocorrer os seguintes resultados:
Retorno do código de status HTTP
200 OK, indicando sucesso na chamada. Nessa situação, o cliente obtém o mesmo resultado da requisição inicial, sem impacto no servidor.Retorno de um código de status HTTP de falha, como
400 Bad Request. Se aparecer uma mensagem de erro comotry it later, a requisição de nova tentativa falhou. Analise as causas com base nas mensagens de erro e envie outra requisição.
Exemplos de requisições
Neste exemplo, a operação CreateStack cria uma stack em uma requisição de nova tentativa. Se você definir o parâmetro de requisição ClientToken com o mesmo valor usado na requisição inicial e não alterar os demais parâmetros, o valor de StackId retornado pelo servidor será idêntico ao da primeira requisição. Caso o parâmetro ClientToken tenha um valor diferente do original, o servidor poderá retornar valores distintos para StackId e criar múltiplas stacks.
Exemplos de requisições
http(s)://ros.aliyuncs.com/?Action=CreateStack
&RegionId=cn-hangzhou
&StackName=MyStack
&TemplateBody={"ROSTemplateFormatVersion": "2015-09-01"}
&ClientToken=123e4567-e89b-12d3-a456-42665544****
&<Common request parameters>
Exemplos de respostas
{
"StackId": "4a6c9851-3b0f-4f5f-b4ca-a14bf691****",
"RequestId": "B288A0BE-D927-4888-B0F7-B35EF84B6E6F"
}