Respostas:
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 discard
método. O discard
mé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.
set
exemplo do Python na resposta, o objeto set claramente tem estado e também oferece algumas operações idempotentes, como discard
.
discard
també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.
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.
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 .
Não importa quantas vezes você chame a operação, o resultado será o mesmo.
truncate
e delete
.
Idempotência significa que aplicar uma operação uma vez ou várias vezes tem o mesmo efeito.
Exemplos:
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.
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.
f(x) = f(f(x))
. Mas como o @GregHewgill mencionou, para que essa definição faça sentido, você deve considerar x
como um objeto e f
como uma operação que modifica o estado do objeto (ou seja: a saída de f
é uma variável x
).
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.
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 User
classe 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 User
construtores 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');
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.
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
Bastante respostas detalhadas e técnicas. Apenas adicionando uma definição simples.
Idempotent = Re-executável
Por exemplo,
Create
nã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).
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
É 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?
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.
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.
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 DELETE
são operações idempotentes; no entanto POST and PATCH
não são. É por isso que às vezes POST
é substituído por PUT
.
tente novamente com segurança.
Geralmente, é a maneira mais fácil de entender seu significado na ciência da computação.
Idempotent operations are often used in the design of network protocols
este é 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.