O que é uma operação idempotente?

Respostas:

964

Na computação, uma operação idempotente é aquela que não tem efeito adicional se for chamada mais de uma vez com os mesmos parâmetros de entrada. Por exemplo, remover um item de um conjunto pode ser considerado uma operação idempotente no conjunto.

Em matemática, uma operação idempotente é aquela em que f (f (x)) = f (x) . Por exemplo, a abs()função é idempotente porque abs(abs(x)) = abs(x)para todos x.

Essas definições ligeiramente diferentes podem ser reconciliadas considerando-se que x na definição matemática representa o estado de um objeto ef é uma operação que pode alterar esse objeto. Por exemplo, considere o Pythonset e seu discardmétodo. O discardmétodo remove um elemento de um conjunto e não faz nada se o elemento não existir. Assim:

my_set.discard(x)

tem exatamente o mesmo efeito que executar a mesma operação duas vezes:

my_set.discard(x)
my_set.discard(x)

Operações idempotentes são frequentemente usadas no design de protocolos de rede, onde é garantido que uma solicitação para executar uma operação ocorre pelo menos uma vez, mas também pode ocorrer mais de uma vez. Se a operação for idempotente, não haverá mal em executar a operação duas ou mais vezes.

Veja o artigo da Wikipedia sobre idempotência para obter mais informações.


A resposta acima anteriormente tinha alguns exemplos incorretos e enganosos. Os comentários abaixo, escritos antes de abril de 2014, se referem a uma revisão mais antiga.

Greg Hewgill
fonte
6
Exemplo: como a resposta acima afirma que Idempotent operations are often used in the design of network protocolseste é um exemplo relacionado ** GET não deve alterar nada no servidor, portanto GET é idempotente. No contexto HTTP / servlet, significa que a mesma solicitação pode ser feita duas vezes sem consequências negativas. ** POST NÃO é idempotente.
KNU
1
"Apátrida" é sinônimo de "idempotente"?
Michael Osofsky
2
@ MichaelOsofsky: Não, no setexemplo do Python na resposta, o objeto set claramente tem estado e também oferece algumas operações idempotentes, como discard.
Greg Hewgill
1
@MichaelOsofsky, discardtambém pode ser implementado de uma forma sem estado, abrangendo o Estado no valor de retorno: discard([my_set, x]) = [my_new_set, x]. Então você pode fazer discard(discard([my_set, x])). Observe que esse [my_new_set, x]é apenas um argumento e seu tipo é de 2 tuplas.
21315 Pacerier
2
@ Green Ao usar o termo mesmo efeito no contexto da impotência, significa que o resultado é o mesmo, não a ação . Chamar discard(x)uma segunda vez terá o mesmo efeito que chamá-lo da primeira vez: O aparelho não conterá mais x. A idempotência da computação é sobre a robustez de um sistema. Como as coisas podem falhar (por exemplo, falta de rede), quando uma falha é detectada, como você se recupera? A recuperação mais fácil é apenas fazê-lo novamente, mas isso só funciona se fazê-lo novamente for idempotente. Por exemplo, discard(x)é idempotente, mas pop()não é. É tudo sobre recuperação de erros.
Andreas
138

Uma operação idempotente pode ser repetida um número arbitrário de vezes e o resultado será o mesmo como se tivesse sido feito apenas uma vez. Em aritmética, adicionar zero a um número é idempotente.

A idempotência é muito comentada no contexto de serviços da web "RESTful". O REST procura aproveitar ao máximo o HTTP para dar acesso aos programas ao conteúdo da Web e geralmente é definido em contraste com os serviços da Web baseados em SOAP, que apenas encapsulam os serviços de estilo de chamada de procedimento remoto nas solicitações e respostas HTTP.

O REST organiza um aplicativo Web em "recursos" (como um usuário do Twitter ou uma imagem do Flickr) e, em seguida, usa os verbos HTTP de POST, PUT, GET e DELETE para criar, atualizar, ler e excluir esses recursos.

A idempotência desempenha um papel importante no REST. Se você obtiver uma representação de um recurso REST (por exemplo, GET uma imagem jpeg do Flickr) e a operação falhar, basta repetir o GET várias vezes até que a operação seja bem-sucedida. Para o serviço da web, não importa quantas vezes a imagem é obtida. Da mesma forma, se você usar um serviço da Web RESTful para atualizar as informações da sua conta do Twitter, poderá COLOCAR as novas informações quantas vezes forem necessárias para obter confirmação do serviço da web. Colocá-lo mil vezes é o mesmo que COLOCAR uma vez. Da mesma forma, EXCLUIR um recurso REST mil vezes é o mesmo que excluí-lo uma vez. Assim, a idempotência facilita muito a construção de um serviço da web que resiliente a erros de comunicação.

Leitura adicional: RESTful Web Services , de Richardson e Ruby (a idempotência é discutida na página 103-104), e a dissertação de doutorado de Roy Fielding sobre REST . Fielding foi um dos autores do HTTP 1.1, RFC-2616, que fala sobre idempotência na seção 9.1.2 .

Jim Ferrans
fonte
Clara e direta. No entanto, essa é apenas uma interpretação de idempotente.
Pacerier
10
"idempotência" é uma palavra muito sobrecarregada, porque soa grandiloqüente e possui caracteres suficientes para passar no teste sesquipedaliano. Se Benjamin Peirce tivesse escolhido uma palavra mais simples, não teríamos essa pergunta hoje.
Pacerier 11/03/2015
2
Como entender: EXCLUIR de maneira semelhante um recurso REST mil vezes é o mesmo que excluí-lo uma vez ? Você não pode excluir o recurso novamente se ele já estiver excluído.
Verde
1
@ Green, mas você não o exclui da primeira vez. Você envia uma solicitação de exclusão . O ponto importante é que você pode enviar quantas solicitações desejar.
Caleth
1
@ JimFerrans eu vejo. Eu pensei que poderia haver algum motivo relacionado à funcionalidade (incorporado no próprio HTTP) do motivo pelo qual o PUT pode ser reenviado sem preocupações, enquanto o POST não pode. Agora parece que somos simplesmente obrigados a estar em conformidade com os padrões HTTP e o comportamento é totalmente baseado em como o servidor é implementado
mangusta
109

Não importa quantas vezes você chame a operação, o resultado será o mesmo.

Robert
fonte
8
Ouvi idempotente definido como um ou ambos os itens abaixo: 1) Para um determinado conjunto de entradas, ele sempre retornará a mesma saída. 2) Não produz efeitos colaterais. Minha pergunta é: se uma função está em conformidade com o número 1, mas não com o número 2, porque resulta em um efeito colateral não relacionado ao cálculo (registra a solicitação em um armazenamento de dados, por exemplo), ela ainda é considerada idempotente?
Keith Bennett
12
O resultado da chamada de uma operação deve incluir o estado do sistema; portanto, se a operação tiver algum efeito colateral cumulativo, ela não será idempotente; no entanto, se o efeito colateral deixar o sistema no mesmo estado, não importa quantas vezes a operação seja chamada, poderá ser idempotente.
Robert
4
Curto e doce, eu amo esse tipo de resposta. Não sei por que tenho que procurar esse termo constantemente, é aquele que simplesmente não fica comigo.
Prancer
1
@ KeithBennett, a segunda definição está errada. "Nenhum efeito colateral" não significa idempotente. Funções idempotentes podem ter efeitos colaterais. Por exemplo, MySQL truncatee delete.
Pacerier 10/03
O resultado será o mesmo (ou seja, o estado do sistema), mas a resposta pode variar (ou seja, códigos de status HTTP em um serviço REST).
G. Steigert
50

Idempotência significa que aplicar uma operação uma vez ou várias vezes tem o mesmo efeito.

Exemplos:

  • Multiplicação por zero. Não importa quantas vezes você faça isso, o resultado ainda será zero.
  • Definindo um sinalizador booleano. Não importa quantas vezes você o faça, o sinalizador permanecerá definido.
  • Excluindo uma linha de um banco de dados com um determinado ID. Se você tentar novamente, a linha ainda desapareceu.

Para funções puras (funções sem efeitos colaterais), a idempotência implica que f (x) = f (f (x)) = f (f (f (x))) = f (f (f (f (x))) ) = ...... para todos os valores de x

Para funções com efeitos colaterais , a idempotência implica ainda que nenhum efeito colateral adicional será causado após a primeira aplicação. Você pode considerar o estado do mundo como um parâmetro "oculto" adicional para a função, se desejar.

Observe que em um mundo em que você tem ações simultâneas, você pode achar que as operações que você julgava idempotentes deixam de ser assim (por exemplo, outro encadeamento pode desestabilizar o valor do sinalizador booleano no exemplo acima). Basicamente, sempre que você tem simultaneidade e estado mutável, precisa pensar muito mais cuidadosamente sobre a idempotência.

A idempotência geralmente é uma propriedade útil na construção de sistemas robustos. Por exemplo, se houver o risco de você receber uma mensagem duplicada de terceiros, é útil fazer com que o manipulador de mensagens atue como uma operação idempotente para que o efeito da mensagem ocorra apenas uma vez.

Mikera
fonte
1
Se para funções puras f(x) = f(f(x)), você quer dizer que f(x){return x+1;}não é uma função pura? porque f(x) != f(f(x)): f(1)dá 2, enquanto f(2)dá 3.
Pacerier
1
@Pacerier Não, @mikera está dizendo puro e idempotente implica f(x) = f(f(x)). Mas como o @GregHewgill mencionou, para que essa definição faça sentido, você deve considerar xcomo um objeto e fcomo uma operação que modifica o estado do objeto (ou seja: a saída de fé uma variável x).
Justin J Stark
24

Uma operação idempotente produz o resultado no mesmo estado, mesmo que você o chame mais de uma vez, desde que você passe os mesmos parâmetros.

Caleb Huitt - cjhuitt
fonte
1
Não parece lógico. stackoverflow.com/questions/1077412/…
Verde
2
Eu acho que você pode estar confuso, idempotente e determinista .
precisa saber é o seguinte
16

Só queria jogar fora um caso de uso real que demonstrasse idempotência. Em JavaScript, digamos que você esteja definindo várias classes de modelo (como no modelo MVC). A maneira como isso geralmente é implementado é funcionalmente equivalente a algo assim (exemplo básico):

function model(name) {
  function Model() {
    this.name = name;
  }

  return Model;
}

Você pode definir novas classes como esta:

var User = model('user');
var Article = model('article');

Mas se você tentar obter a Userclasse via model('user'), de algum outro lugar no código, ela falhará:

var User = model('user');
// ... then somewhere else in the code (in a different scope)
var User = model('user');

Esses dois Userconstrutores seriam diferentes. Isso é,

model('user') !== model('user');

Para torná-lo idempotente , basta adicionar algum tipo de mecanismo de cache, como este:

var collection = {};

function model(name) {
  if (collection[name])
    return collection[name];

  function Model() {
    this.name = name;
  }

  collection[name] = Model;
  return Model;
}

Ao adicionar o cache, toda vez que você o fizer model('user'), será o mesmo objeto e, portanto, será idempotente. Assim:

model('user') === model('user');
Lance Pollard
fonte
10

Uma operação idempotente é uma operação, ação ou solicitação que pode ser aplicada várias vezes sem alterar o resultado, ou seja, o estado do sistema, além do aplicativo inicial.

EXEMPLOS (CONTEXTO DA APP WEB):

IDEMPOTENTE: Fazer várias solicitações idênticas tem o mesmo efeito que fazer uma única solicitação. Uma mensagem em um sistema de mensagens de email é aberta e marcada como "aberta" no banco de dados. Pode-se abrir a mensagem várias vezes, mas essa ação repetida apenas resultará na mensagem no estado "aberto". Esta é uma operação idempotente. Na primeira vez em que uma atualização é colocada em um recurso usando informações que não correspondem ao recurso (o estado do sistema), o estado do sistema será alterado conforme o recurso for atualizado. Se alguém colocar a mesma atualização em um recurso repetidamente, as informações na atualização corresponderão às informações já existentes no sistema em cada PUT, e nenhuma alteração no estado do sistema ocorrerá. PUTs repetidas com as mesmas informações são idempotentes:

NÃO IDEMPOTENTE: Se uma operação sempre causa uma mudança de estado, como POST a mesma mensagem para um usuário repetidamente, resultando em uma nova mensagem enviada e armazenada no banco de dados toda vez, dizemos que a operação é NÃO IDEMPOTENTE.

NULLIPOTENT: se uma operação não tiver efeitos colaterais, como exibir informações puramente em uma página da Web sem nenhuma alteração no banco de dados (em outras palavras, você está apenas lendo o banco de dados), dizemos que a operação é NULLIPOTENT. Todos os GETs devem ser nulipotentes.

Ao falar sobre o estado do sistema, obviamente estamos ignorando os efeitos esperançosamente inofensivos e inevitáveis, como registro e diagnóstico.

nmit026
fonte
9

Operações Idempotentes: Operações que não têm efeitos colaterais se executadas várias vezes.
Exemplo : Uma operação que recupera valores de um recurso de dados e, por exemplo, imprime nele

Operações Não Idempotentes: Operações que causariam algum dano se executadas várias vezes. (Como eles alteram alguns valores ou estados)
Exemplo: Uma operação que é retirada de uma conta bancária

Mahmoud Abou-Eita
fonte
3
Na verdade, uma resposta errada! para a operação Idempotent dizendo "não tem efeitos colaterais" não está certo. para as operações não idempotentes dizendo "causar algum dano" é uma resposta confusa.
Saeed Mohtasham
9

Bastante respostas detalhadas e técnicas. Apenas adicionando uma definição simples.

Idempotent = Re-executável

Por exemplo, Createnão é garantido que a operação seja executada sem erros se executada mais de uma vez. Mas se houver uma operação CreateOrUpdate, ela declara a capacidade de executar novamente (Idempotency).

Manish Basantani
fonte
3
Esta é uma definição enganosa. re-runnability não garante ser idempotente. Uma operação pode ser executável novamente e, em cada execução, pode adicionar efeitos adicionais ao resultado para que não seja idempotente.
precisa saber é o seguinte
7

Uma operação idempotente sobre um conjunto mantém seus membros inalterados quando aplicados uma ou mais vezes.

Pode ser uma operação unária como absoluta (x), em que x pertence a um conjunto de números inteiros positivos. Aqui absoluto (absoluto (x)) = x.

Pode ser uma operação binária, pois a união de um conjunto consigo sempre retornaria o mesmo conjunto.

Felicidades

Arnkrishn
fonte
Uma operação idempotente é aquela em que f (f (x)) = f (x). "deixa seus membros inalterados" não é a resposta certa.
precisa saber é o seguinte
7

É qualquer operação que a cada enésimo resultado resultará em uma saída correspondente ao valor do 1º resultado. Por exemplo, o valor absoluto de -1 é 1. O valor absoluto do valor absoluto de -1 é 1. O valor absoluto do valor absoluto do valor absoluto de -1 é 1. E assim por diante.

Veja também: Quando seria um momento muito bobo para usar a recursão?

Oorang
fonte
1
é uma resposta concisa mesmo depois de 10 anos. +1
snr
3

Um bom exemplo de como entender uma operação idempotente pode ser trancar um carro com chave remota.

log(Car.state) // unlocked

Remote.lock();
log(Car.state) // locked

Remote.lock();
Remote.lock();
Remote.lock();
log(Car.state) // locked

locké uma operação idempotente. Mesmo se houver algum efeito colateral toda vez que você correr lock, como piscar, o carro ainda estará no mesmo estado travado, não importa quantas vezes você execute a operação de travamento.

ivn
fonte
1

my 5c: Na integração e na rede, a idempotência é muito importante. Vários exemplos da vida real: imagine, entregamos dados ao sistema de destino. Dados entregues por uma sequência de mensagens. 1. O que aconteceria se a sequência fosse mixada no canal? (Como os pacotes de rede sempre fazem :)). Se o sistema de destino for idempotente, o resultado não será diferente. Se o sistema de destino depende da ordem correta na sequência, temos que implementar o sequenciador no site de destino, o que restauraria a ordem correta. 2. O que aconteceria se a mensagem duplicasse? Se o canal do sistema de destino não reconhecer oportunamente, o sistema de origem (ou o próprio canal) normalmente envia outra cópia da mensagem. Como resultado, podemos ter uma mensagem duplicada no lado do sistema de destino. Se o sistema de destino for idempotente, cuida disso e o resultado não será diferente. Se o sistema de destino não for idempotente, precisamos implementar o desduplicador no lado do sistema de destino do canal.

Leonid Ganeline
fonte
Idempotência de solicitações únicas enviadas isoladamente de outras solicitações (ou qualquer outra coisa acontecendo que mude o estado do sistema) não é o mesmo que reordenar solicitações. Uma solicitação HTTP PUT e uma solicitação HTTP DELETE devem ser individualmente idempotentes - mas isso não significa que a ordem de chamar PUT e DELETE na mesma URL não importa, porque a solicitação PUT pode ter efeitos colaterais!
Robin Green
1

Em resumo , operações idempotentes significa que a operação não resultará em resultados diferentes, não importa quantas vezes você opere as operações idempotentes.

Por exemplo, de acordo com a definição das especificações do HTTP, GET, HEAD, PUT, and DELETEsão operações idempotentes; no entanto POST and PATCHnão são. É por isso que às vezes POSTé substituído por PUT.

Marcus Thornton
fonte
-4

tente novamente com segurança.

Geralmente, é a maneira mais fácil de entender seu significado na ciência da computação.

teknopaul
fonte
1
Repetir implica algo que falhou na primeira ou na anterior. Não é bem o mesmo.
Lasse V. Karlsen
Quem editou minha pergunta e me deu um voto negativo? Esse não é o texto que eu postei ??
teknopaul
Você pode verificar o log de edição clicando no link abaixo da sua resposta que diz "editado X horas atrás" ou similar.
Lasse V. Karlsen