Em ciência da computação, idempotência é uma propriedade de uma operação em que aplicá-la várias vezes tem o mesmo efeito final que aplicá-la apenas uma vez. Se você enviar a mesma solicitação para um servidor cinco vezes, um sistema idempotente garante que o resultado no servidor não mude após a primeira tentativa bem-sucedida.
Além de garantir o mesmo resultado, uma característica fundamental das operações idempotentes é que elas não produzem efeitos colaterais com chamadas adicionais. Esse é um requisito essencial para a criação de sistemas distribuídos resilientes em que interrupções de rede intermitentes ou tempos limite podem fazer com que um cliente envie a mesma mensagem mais de uma vez.
Analogia: pense no botão "para cima" de um elevador. Se você pressionar uma vez, o elevador será chamado para o seu andar. Se você apertar o botão mais dez vezes enquanto espera, o resultado será o mesmo: um elevador vai chegar ao seu andar. Pressionar o botão várias vezes não vai chamar dez elevadores separados. Por outro lado, adicionar um item a um carrinho de compras digital geralmente não é idempotente. Se você clicar no botão "Adicionar ao carrinho" cinco vezes, provavelmente vai acabar com cinco itens no seu carrinho.
Tente novamente as solicitações com segurança após um tempo limite ou queda de conexão sem medo de duplicar ações (como cobrar duas vezes um cartão de crédito).
Os usuários não precisam de um rastreamento de estado complexo para saber se uma solicitação anterior foi bem-sucedida. Eles podem simplesmente "tentar novamente até ter sucesso".
Os sistemas distribuídos podem se recuperar de falhas reproduzindo registros ou reenviando mensagens perdidas sem corromper os dados.
O padrão REST define como diferentes tipos de solicitações da web devem se comportar. Alguns métodos HTTP são naturalmente "seguros" ou idempotentes por design, ou seja, a especificação espera que eles se comportem de forma previsível mesmo quando repetidos. Outros são projetados para criar novos dados e exigem mais cuidado para serem seguros para novas tentativas.
De acordo com a RFC 9110, vários métodos padrão são inerentemente idempotentes. A repetição dessas ações não deve mudar o estado do servidor além da solicitação inicial.
Alguns métodos não são idempotentes porque o principal trabalho deles é mudar os dados de uma forma que cria algo novo ou modifica uma parte de um registro atual.
A idempotência é frequentemente necessária nos sistemas que criamos. Em alguns casos, isso é feito por nós. Em outros casos, nós, como desenvolvedores, precisamos agir para que isso aconteça.
O exemplo mais famoso é o problema da "cobrança dupla". Se o navegador de um usuário travar enquanto ele estiver pagando por um voo, ele poderá clicar em "Pagar" novamente. Uma API de pagamento que usa uma chave de idempotência garante que o segundo clique seja reconhecido como uma nova tentativa. Isso protege a conta bancária do cliente e reduz o custo operacional de lidar com reembolsos de transações duplicadas.
Ferramentas como Terraform e Ansible dependem da idempotência. Quando você executa um script para "criar um bucket de armazenamento de 10 GB", a ferramenta verifica o estado atual da sua nuvem.
As APIs da web modernas costumam implementar o cabeçalho Idempotency-Key (agora um rascunho padronizado da IETF) para permitir que os desenvolvedores criem integrações mais robustas.
"Upsert" (atualizar ou inserir) é uma operação de banco de dados idempotente clássica. Em vez de uma simples "inserção", um upsert diz: "Se este registro existir, atualize-o; caso contrário, crie-o".
O Google Cloud oferece várias ferramentas que facilitam a implementação desses padrões para os desenvolvedores. A criação em uma plataforma gerenciada reduz a quantidade de código "boilerplate" que você precisa escrever para manter seus dados seguros.


Saiba como implantar serviços resilientes e idempotentes no Cloud Run hoje mesmo.