Pergunta

O que é uma operação idempotente?

Foi útil?

Solução

Em computação, uma operação idempotente é aquele que não tem nenhum efeito adicional se for chamado mais de uma vez com os mesmos parâmetros de entrada. Por exemplo, a remoção de um item de um conjunto pode ser considerado uma operação idempotente no set.

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

Estas definições ligeiramente diferentes podem ser conciliados, considerando que x na definição matemática representa o estado de um objeto, e f é uma operação que pode transformar esse objeto. Por exemplo, considere o Python set seu método discard . O método discard remove um elemento de um conjunto, e não faz nada se o elemento não existe. Assim:

my_set.discard(x)

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

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

operações idempotentes são muitas vezes utilizados no projeto de protocolos de rede, quando um pedido para executar uma operação é garantida a acontecer pelo menos uma vez, mas também pode acontecer mais de uma vez. Se a operação for idempotent, então não há mal nenhum em executar a operação de duas ou mais vezes.

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


A resposta acima tinham anteriormente alguns exemplos incorrectas e enganosas. Comentários abaixo escritos antes de abril 2014 referem-se a uma revisão mais antiga.

Outras dicas

Uma operação idempotente pode ser repetido um número arbitrário de vezes e o resultado será o mesmo que se tivesse sido feita apenas uma vez. Em aritmética, acrescentando zero a um número é idempotent.

idempotência é falado sobre um monte no contexto de "RESTful" serviços web. RESTO procura alavancagem máximo HTTP para dar programas de acesso ao conteúdo da web, e é geralmente definida em contraste com serviços web baseados em SOAP, que apenas túnel de procedimento remoto serviços de estilo chamada dentro HTTP solicitações e respostas.

RESTO organiza uma aplicação web em "recursos" (como um usuário do Twitter, ou uma imagem Flickr) e, em seguida, usa o HTTP verbos de POST, PUT, GET, e DELETE para criar, atualizar, ler e apagar esses recursos.

idempotência desempenha um papel importante em REST. Se você receber uma representação de um recurso REST (por exemplo, obter uma imagem JPEG de Flickr), e a operação falhar, você pode simplesmente repetir o GET uma e outra vez até que a operação bem-sucedida. Para o serviço de web, não importa quantas vezes a imagem é obtida. Da mesma forma, se você usar um serviço web RESTful para atualizar suas informações de conta no Twitter, você pode colocar a nova informação tantas vezes quanto for preciso, a fim de obter a confirmação do serviço web. COLOQUE-ing-lo mil vezes é o mesmo que PUT-ing-lo uma vez. Da mesma forma delete-ing um recurso REST mil vezes é o mesmo que excluí-lo uma vez. Idempotência, portanto, torna muito mais fácil para construir um serviço web que é resistente a erros de comunicação.

Além disso leitura: RESTful Web Services , por Richardson e Ruby (idempotência é discutido na página 103-104) e PhD dissertação de Roy Fielding em RESTO . Fielding foi um dos autores do HTTP 1.1, RFC-2616, que fala sobre idempotência em seção 9.1.2 .

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

idempotência meios que a aplicação de uma operação de uma ou aplicá-lo várias vezes tem o mesmo efeito.

Exemplos:

  • A multiplicação por zero. Não importa quantas vezes você faz isso, o resultado ainda é zero.
  • Definir um sinalizador booleano. Não importa quantas vezes você faz isso, o estadias bandeira set.
  • Exclusão de uma linha de uma base de dados com um determinado ID. Se você tentar isso novamente, a linha ainda está desaparecido.

Para funções puras (funções sem efeitos secundários), então 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 , idempotency implica ainda que sem efeitos colaterais adicionais serão causados ??após a primeira aplicação. Você pode considerar o estado do mundo a ser um parâmetro adicional "escondida" para a função, se quiser.

Note que em um mundo onde você tem ações simultâneas acontecendo, você pode achar que as operações de você achava que eram idempotent deixar de ser assim (por exemplo, outro segmento pode resetar o valor do sinalizador booleano no exemplo acima). Basicamente, sempre que você tem concorrência e estado mutável, você precisa pensar muito mais cuidadosamente sobre idempotency.

idempotency muitas vezes é uma propriedade útil na construção de sistemas robustos. Por exemplo, se há um risco de que você pode receber uma mensagem duplicada de um terceiro, é útil ter o ato manipulador de mensagem como uma operação idempotente para que o efeito mensagem só acontece uma vez.

Operação Uma idempotent produz o resultado no mesmo estado, mesmo se você chamá-lo mais de uma vez, desde que você passar nos mesmos parâmetros.

Apenas queria jogar fora um caso de uso real que demonstra idempotência. Em JavaScript, digamos que você está definindo um monte de classes de modelo (como no modelo MVC). A forma como este é frequentemente implementada é funcionalmente equivalente a algo como isto (exemplo básico):

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

  return Model;
}

Você pode então definir novas classes como este:

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

Mas se você fosse para tentar obter a classe User via model('user'), de algum outro lugar no código, ele iria falhar:

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

Os dois construtores User seria diferente. Ou seja,

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

Para torná-lo idempotent , você gostaria apenas de acrescentar 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 caching, cada vez que você fez model('user') será o mesmo objeto, e por isso é idempotent. Assim:

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

Uma operação idempotente é uma operação, a acção, ou a pedido que pode ser aplicado várias vezes sem alterar o resultado, isto é, o estado do sistema, para além da aplicação inicial.

EXEMPLOS (WEB APP CONTEXTO):

idempotente: Fazendo vários pedidos idênticos tem o mesmo efeito que fazer um único pedido. Uma mensagem em um sistema de mensagens de e-mail é aberto e marcado como "aberta" no banco de dados. Pode-se abrir a mensagem muitas vezes, mas esta ação repetida só vai resultar em que a mensagem estar no estado "aberto". Esta é uma operação idempotente. A primeira vez que se coloca uma actualização para um recurso usando informações que não coincide com o recurso (o estado do sistema), o estado do sistema irá mudar à medida que o recurso é atualizado. Se se coloca a mesma atualização para um recurso repetidamente, em seguida, as informações contidas na actualização irá coincidir com as informações que já estão no sistema em cima de cada PUT, e nenhuma mudança para o estado do sistema irá ocorrer. TUP repetidas com as mesmas informações são idempotent: o primeiro PUT pode alterar o estado do sistema, TUP subseqüentes não deveria.

Não-idempotente: Se uma operação sempre causa uma mudança de estado, como postar a mesma mensagem para um usuário mais e mais, resultando em uma nova mensagem enviada e armazenada no banco de dados de cada vez, dizemos que a operação é não-idempotent.

NULLIPOTENT: Se uma operação não tem efeitos colaterais, como a exibição puramente informações em uma página web sem qualquer alteração em um banco de dados (em outras palavras, você está apenas lendo o banco de dados), dizemos que a operação é NULLIPOTENT. Tudo fica deve ser nullipotent.

Ao falar sobre o estado do sistema que são, obviamente, ignorando espero efeitos inofensivos e inevitáveis, como o registo e diagnóstico.

Operações idempotente: Operações que não têm efeitos colaterais se executado várias vezes.
Exemplo : Uma operação que os valores obtidos a partir de um recurso de dados e dizer, imprime
Não-idempotent Operações: Operações que poderiam causar algum dano se executado várias vezes. (Como eles alterar alguns valores ou estados)
Exemplo: Uma operação que retira de uma conta bancária

a respostas bastante detalhadas e técnicas. Basta adicionar uma definição simples.

idempotente = Re-executável

Por exemplo, operação Create em si não é garantido para ser executado sem erros se executado mais de uma vez. Mas se há uma CreateOrUpdate operação, em seguida, ele afirma re-operabilidade (idempotency).

Uma operação idempotente sobre um conjunto deixa seus membros inalterada quando aplicado uma ou mais vezes.

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

Pode ser uma operação binária como união de um conjunto com o próprio voltar sempre o mesmo conjunto.

aplausos

É qualquer operação que cada resultado enésimo irá 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 tempo muito bobo para uso recursão

minha 5c: Na integração e networking o idempotency é muito importante. Vários exemplos de vida real: Imaginem, nós entregamos dados para o sistema de destino. Dados entregue por uma sequência de mensagens. 1. O que aconteceria se a sequência é misturado no canal? (Como pacotes de rede sempre fazer :)). Se o sistema de destino é idempotent, o resultado não será diferente. Se o sistema de destino depende da ordem direita na sequência, temos que implementar re-sequenciador no site de destino, que iria restaurar a ordem correta. 2. O que aconteceria se existem as duplicatas mensagem? Se o canal do sistema de destino não reconhece oportuna, o sistema de origem (ou o próprio canal) normalmente envia uma outra cópia da mensagem. Como resultado, podemos ter mensagem duplicada no lado do sistema de destino. Se o sistema de destino é idempotente, que cuida dele e resultado não será diferente. Se o sistema de destino não é idempotent, temos que implementar Deduplicator no lado do sistema de destino do canal.

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

Por exemplo, de acordo com a definição da especificação de 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 PATCH.

repetição de segurança.

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top