Che cos'è un'operazione idempotente?


Risposte:


964

Nell'informatica, un'operazione idempotente è un'operazione che non ha alcun effetto aggiuntivo se viene chiamata più volte con gli stessi parametri di input. Ad esempio, la rimozione di un elemento da un set può essere considerata un'operazione idempotente sul set.

In matematica, un'operazione idempotente è quella in cui f (f (x)) = f (x) . Ad esempio, la abs()funzione è idempotente perché abs(abs(x)) = abs(x)per tutti x.

Queste definizioni leggermente diverse possono essere riconciliate considerando che x nella definizione matematica rappresenta lo stato di un oggetto e f è un'operazione che può mutare quell'oggetto. Ad esempio, considera Pythonset e il suo discardmetodo. Il discardmetodo rimuove un elemento da un set e non fa nulla se l'elemento non esiste. Così:

my_set.discard(x)

ha esattamente lo stesso effetto di fare due volte la stessa operazione:

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

Le operazioni idempotenti sono spesso utilizzate nella progettazione di protocolli di rete, in cui è garantito che una richiesta di eseguire un'operazione accada almeno una volta, ma potrebbe anche accadere più di una volta. Se l'operazione è idempotente, non vi è alcun danno nell'esecuzione dell'operazione due o più volte.

Vedi l'articolo di Wikipedia sull'idempotenza per ulteriori informazioni.


La risposta di cui sopra aveva in precedenza alcuni esempi errati e fuorvianti. I commenti di seguito scritti prima di aprile 2014 fanno riferimento a una revisione precedente.


6
Esempio: poiché la risposta sopra afferma che Idempotent operations are often used in the design of network protocolsecco un esempio correlato ** GET non suppone di cambiare nulla sul server, quindi GET è idempotente. Nel contesto HTTP / servlet, significa che la stessa richiesta può essere effettuata due volte senza conseguenze negative. ** POST NON è idempotente.
KNU

1
"Apolide" è sinonimo di "idempotente"?
Michael Osofsky,

2
@MichaelOsofsky: No, nell'esempio Python setnella risposta, l'oggetto set ha chiaramente uno stato e offre anche alcune operazioni idempotenti come discard.
Greg Hewgill,

1
@MichaelOsofsky, discardpossono anche essere attuato in modo stateless inglobando stato nel valore di ritorno: discard([my_set, x]) = [my_new_set, x]. Quindi puoi farlo discard(discard([my_set, x])). Nota che [my_new_set, x]è solo un argomento e il suo tipo è 2-tupla.
Pacerier

2
@Verde Quando si usa il termine stesso effetto nel contesto dell'impotenza, significa che il risultato è lo stesso, non l' azione . Chiamare discard(x)una seconda volta avrà lo stesso effetto della prima volta: il set non conterrà più x. L'idempotenza informatica riguarda la solidità di un sistema. Poiché le cose possono fallire (ad es. Interruzione di rete), quando viene rilevato un errore, come si ripristina? Il recupero più semplice è farlo di nuovo, ma funziona solo se farlo di nuovo è idempotente. Ad esempio discard(x)è idempotente, ma pop()non lo è. Si tratta di recuperare errori.
Andreas,

138

Un'operazione idempotente può essere ripetuta un numero arbitrario di volte e il risultato sarà lo stesso di se fosse stato fatto solo una volta. In aritmetica, l'aggiunta di zero a un numero è idempotente.

L'idempotenza è molto discussa nel contesto dei servizi web "RESTful". REST cerca di sfruttare al massimo l'HTTP per fornire ai programmi l'accesso al contenuto Web e di solito è impostato in contrasto con i servizi Web basati su SOAP, che effettuano semplicemente il tunneling di servizi di stile di chiamata di procedura remota all'interno di richieste e risposte HTTP.

REST organizza un'applicazione Web in "risorse" (come un utente Twitter o un'immagine Flickr) e quindi utilizza i verbi HTTP POST, PUT, GET e DELETE per creare, aggiornare, leggere ed eliminare tali risorse.

L'idempotenza svolge un ruolo importante nel REST. Se OTTIENI una rappresentazione di una risorsa REST (ad esempio, OTTIENI un'immagine jpeg da Flickr) e l'operazione non riesce, puoi semplicemente ripetere GET ancora e ancora fino a quando l'operazione non riesce. Per il servizio Web, non importa quante volte l'immagine viene ottenuta. Allo stesso modo, se si utilizza un servizio Web RESTful per aggiornare le informazioni del proprio account Twitter, è possibile INSERIRE le nuove informazioni tutte le volte che è necessario per ottenere la conferma dal servizio web. Metterlo mille volte è lo stesso di Metterlo una volta. Allo stesso modo ELIMINARE una risorsa REST mille volte equivale a eliminarla una volta. L'idempotenza rende quindi molto più semplice la costruzione di un servizio Web resiliente agli errori di comunicazione.

Ulteriori letture: RESTful Web Services , di Richardson e Ruby (l'idempotenza è discussa a pagina 103-104) e la tesi di dottorato di Roy Fielding su REST . Fielding è stato uno degli autori di HTTP 1.1, RFC-2616, che parla di idempotenza nella sezione 9.1.2 .


Chiaro e semplice. Eppure questa è solo una interpretazione di idempotente.
Pacerier

10
"idempotenza" è una parola pesantemente sovraccarica perché suona grandiloquente e ha caratteri sufficienti per superare il controllo sesquipediano. Se Benjamin Peirce avesse scelto una parola dal suono più semplice, oggi non avremmo nemmeno questa domanda.
Pacerier

2
Come capirlo: Analogamente ELIMINARE una risorsa REST mille volte equivale a cancellarla una volta ? Non è possibile eliminare nuovamente la risorsa se è già stata eliminata.
Verde,

1
@Verde ma non lo elimini la prima volta. Si invia una richiesta di eliminazione . Il punto importante è che puoi inviare tutte le richieste che desideri.
Caleth,

1
@JimFerrans Capisco. Ho pensato che potrebbe esserci qualche motivo legato alla funzionalità (integrato nello stesso HTTP) del perché PUT può essere rinviato senza preoccupazioni mentre POST non può. Ora sembra che siamo semplicemente tenuti a conformarci agli standard HTTP e il comportamento è totalmente basato su come il server è implementato
mangusta

109

Non importa quante volte si chiama l'operazione, il risultato sarà lo stesso.


8
Ho sentito idempotente definito come uno o entrambi i seguenti: 1) Per un dato set di input restituirà sempre lo stesso output. 2) Non produce effetti collaterali. La mia domanda è, se una funzione è conforme al n. 1, ma non al n. 2, poiché provoca un effetto collaterale non correlato al calcolo (registra la richiesta in un archivio dati, ad esempio), è ancora considerata idempotente?
Keith Bennett,

12
Il risultato della chiamata di un'operazione deve includere lo stato del sistema, quindi se l'operazione ha un effetto collaterale cumulativo non è idempotente; tuttavia, se l'effetto collaterale lascia il sistema nello stesso stato, non importa quante volte l'operazione viene chiamata, allora potrebbe essere idempotente.
Robert,

4
Breve e dolce, adoro quel tipo di risposta. Non sono sicuro del motivo per cui devo cercare costantemente questo termine, è uno che non sta con me.
Prancer

1
@KeithBennett, la seconda definizione è sbagliata. "Nessun effetto collaterale" non significa idempotente. Le funzioni idempotenti possono avere effetti collaterali. Ad esempio MySQL truncatee delete.
Pacerier

Il risultato sarà lo stesso (ovvero lo stato del sistema), ma la risposta potrebbe variare (ad es. Codici di stato HTTP su un servizio REST).
G. Steigert,

50

Idempotenza significa che applicare una volta un'operazione o applicarla più volte ha lo stesso effetto.

Esempi:

  • Moltiplicazione per zero. Non importa quante volte lo fai, il risultato è ancora zero.
  • Impostazione di una bandiera booleana. Non importa quante volte lo fai, la bandiera rimane impostata.
  • Eliminazione di una riga da un database con un determinato ID. Se lo riprovi, la riga è ancora andata.

Per le funzioni pure (funzioni senza effetti collaterali) allora l'idempotenza implica che f (x) = f (f (x)) = f (f (f (x))) = f (f (f (f (x ()))) ) = ...... per tutti i valori di x

Per le funzioni con effetti collaterali , l'idempotenza implica inoltre che non saranno causati ulteriori effetti collaterali dopo la prima applicazione. Se lo desideri, puoi considerare lo stato del mondo come un parametro "nascosto" aggiuntivo alla funzione.

Si noti che in un mondo in cui sono in corso azioni simultanee, è possibile che le operazioni ritenute idempotenti cessino di esserlo (ad esempio, un altro thread potrebbe annullare il valore della bandiera booleana nell'esempio sopra). Fondamentalmente ogni volta che si ha la concorrenza e lo stato mutevole, è necessario riflettere molto più attentamente sull'idempotenza.

L'idempotenza è spesso una proprietà utile nella costruzione di sistemi robusti. Ad esempio, se esiste il rischio che tu possa ricevere un messaggio duplicato da una terza parte, è utile che il gestore messaggi agisca come un'operazione idempotente in modo che l'effetto del messaggio si verifichi una sola volta.


1
Se per funzioni pure f(x) = f(f(x)), vuoi dire che f(x){return x+1;}non è una funzione pura? perché f(x) != f(f(x)): f(1)dà 2 mentre f(2)dà 3.
Pacerier

1
@Pacerier No, @mikera dice che implica puro e idempotente f(x) = f(f(x)). Ma come accennato da @GregHewgill, affinché questa definizione abbia un senso, devi considerare xcome un oggetto e fcome un'operazione che muta lo stato dell'oggetto (cioè: l'output di fè mutato x).
Justin J Stark,


16

Volevo solo lanciare un caso d'uso reale che dimostra idempotenza. In JavaScript, supponi di definire un gruppo di classi di modelli (come nel modello MVC). Il modo in cui questo viene spesso implementato è funzionalmente equivalente a qualcosa del genere (esempio di base):

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

  return Model;
}

È quindi possibile definire nuove classi come questa:

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

Ma se dovessi provare a ottenere la Userclasse tramite model('user'), da qualche altra parte del codice, fallirebbe:

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

Quei due Usercostruttori sarebbero diversi. Questo è,

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

Per renderlo idempotente , è sufficiente aggiungere una sorta di meccanismo di memorizzazione nella cache, come questo:

var collection = {};

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

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

  collection[name] = Model;
  return Model;
}

Aggiungendo la cache, ogni volta che lo fai model('user')sarà lo stesso oggetto, quindi è idempotente. Così:

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

10

Un'operazione idempotente è un'operazione, un'azione o una richiesta che può essere applicata più volte senza modificare il risultato, ovvero lo stato del sistema, oltre l'applicazione iniziale.

ESEMPI (CONTESTO DELL'APP WEB):

IDEMPOTENT: l'esecuzione di più richieste identiche ha lo stesso effetto di una singola richiesta. Un messaggio in un sistema di messaggistica e-mail viene aperto e contrassegnato come "aperto" nel database. Si può aprire il messaggio molte volte, ma questa azione ripetuta comporterà sempre e solo quel messaggio nello stato "aperto". Questa è un'operazione idempotente. La prima volta che si METTE un aggiornamento a una risorsa utilizzando informazioni che non corrispondono alla risorsa (lo stato del sistema), lo stato del sistema cambierà man mano che la risorsa viene aggiornata. Se uno PUT invia ripetutamente lo stesso aggiornamento a una risorsa, le informazioni nell'aggiornamento corrisponderanno alle informazioni già presenti nel sistema ad ogni PUT e non si verificherà alcuna modifica allo stato del sistema. I PUT ripetuti con le stesse informazioni sono idempotenti:

NON IDEMPOTENTE: se un'operazione provoca sempre un cambiamento di stato, ad esempio POST inviando ripetutamente lo stesso messaggio a un utente, risultando in un nuovo messaggio inviato e archiviato nel database ogni volta, si dice che l'operazione è NON IDEMPOTENTE.

NULLIPOTENT: se un'operazione non ha effetti collaterali, come la semplice visualizzazione di informazioni su una pagina Web senza alcuna modifica in un database (in altre parole si sta solo leggendo il database), si dice che l'operazione è NULLIPOTENT. Tutti i GET dovrebbero essere nullipotent.

Quando parliamo dello stato del sistema, stiamo ovviamente ignorando gli effetti sperabilmente innocui e inevitabili come la registrazione e la diagnostica.


9

Operazioni idempotenti: operazioni che non hanno effetti collaterali se eseguite più volte.
Esempio : un'operazione che recupera i valori da una risorsa dati e dice, la stampa

Operazioni non idempotenti: operazioni che potrebbero causare danni se eseguite più volte. (Mentre cambiano alcuni valori o stati)
Esempio: un'operazione che si ritira da un conto bancario


3
In realtà una risposta sbagliata! per l'operazione idempotente dire "non avere effetti collaterali" non è giusto. per le operazioni non idempotenti che dice "causare qualche danno" è una risposta confusa.
Saeed Mohtasham,

9

Piuttosto una risposta dettagliata e tecnica. Basta aggiungere una semplice definizione.

Idempotent = Ri-eseguibile

Ad esempio, l' Createoperazione in sé non è garantita per l'esecuzione senza errori se eseguita più di una volta. Ma se c'è un'operazione, CreateOrUpdateallora indica la rieseguibilità (Idempotency).


3
Questa è una definizione ingannevole. la rieseguibilità non garantisce di essere idempotente. Un'operazione può essere rieseguibile e in ogni esecuzione può aggiungere effetti aggiuntivi al risultato in modo che non sia idempotente.
Saeed Mohtasham,

7

Un'operazione idempotente su un set lascia invariati i suoi membri quando viene applicata una o più volte.

Può essere un'operazione unaria come assoluta (x) in cui x appartiene a un insieme di numeri interi positivi. Qui assoluto (assoluto (x)) = x.

Può essere un'operazione binaria come l' unione di un set con se stesso restituirebbe sempre lo stesso set.

Saluti


Un'operazione idempotente è quella in cui f (f (x)) = f (x). "lascia invariati i suoi membri" non è una risposta giusta.
Saeed Mohtasham,

7

È qualsiasi operazione che ogni ennesimo risultato comporterà un'uscita corrispondente al valore del primo risultato. Ad esempio, il valore assoluto di -1 è 1. Il valore assoluto del valore assoluto di -1 è 1. Il valore assoluto del valore assoluto di valore assoluto di -1 è 1. E così via.

Vedi anche: Quando sarebbe un momento davvero sciocco usare la ricorsione?


1
è una risposta concreta anche dopo 10 anni. +1
snr

3

Un buon esempio di comprensione di un'operazione idempotente potrebbe essere il blocco di un'auto con chiave remota.

log(Car.state) // unlocked

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

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

lockè un'operazione idempotente. Anche se ci sono degli effetti collaterali ogni volta che corri lock, come battere le palpebre, l'auto è ancora nello stesso stato di blocco, indipendentemente da quante volte esegui l'operazione di blocco.


1

my 5c: In integrazione e networking l'idempotenza è molto importante. Diversi esempi dalla vita reale: immagina di fornire dati al sistema di destinazione. Dati forniti da una sequenza di messaggi. 1. Cosa succederebbe se la sequenza fosse mista nel canale? (Come sempre fanno i pacchetti di rete :)). Se il sistema di destinazione è idempotente, il risultato non sarà diverso. Se il sistema target dipende dal giusto ordine nella sequenza, dobbiamo implementare resequencer sul sito target, che ripristinerebbe il giusto ordine. 2. Cosa accadrebbe se ci fossero duplicati del messaggio? Se il canale del sistema di destinazione non riconosce tempestivamente, il sistema di origine (o il canale stesso) di solito invia un'altra copia del messaggio. Di conseguenza possiamo avere un messaggio duplicato sul lato del sistema di destinazione. Se il sistema di destinazione è idempotente, se ne prende cura e il risultato non sarà diverso. Se il sistema di destinazione non è idempotente, dobbiamo implementare il deduplicatore sul lato del sistema di destinazione del canale.


L'idempotenza delle singole richieste inviate in isolamento da qualsiasi altra richiesta (o qualsiasi altra cosa accada che cambi lo stato del sistema), non è la stessa delle richieste di riordino. Una richiesta HTTP PUT e una richiesta DELETE HTTP devono essere entrambe idempotenti individualmente, ma ciò non significa che l'ordine di chiamare PUT e DELETE sullo stesso URL non abbia importanza, poiché la richiesta PUT potrebbe avere effetti collaterali!
Robin Green

1

In breve , Operazioni idempotenti significa che l'operazione non produrrà risultati diversi, indipendentemente da quante volte si eseguono le operazioni idempotenti.

Ad esempio, secondo la definizione della specifica di HTTP, GET, HEAD, PUT, and DELETEsono operazioni idempotenti; tuttavia POST and PATCHnon lo sono. Ecco perché a volte POSTviene sostituito da PUT.


-4

tentativi di sicurezza.

Di solito è il modo più semplice per comprenderne il significato nell'informatica.


1
Riprovare implica qualcosa che è fallito la prima o la volta precedente. Non proprio la stessa cosa.
Lasse V. Karlsen,

Chi ha modificato la mia domanda e mi ha dato un voto negativo? Questo non è il testo che ho pubblicato ??
Teknopaul,

Puoi controllare il registro delle modifiche facendo clic sul link sotto la tua risposta che dice "modificato X ore fa" o simile.
Lasse V. Karlsen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.