Domanda

Ciò che è un'operazione idempotent?

È stato utile?

Soluzione

In informatica, un'operazione idempotente è uno che non ha alcun effetto aggiuntivo se viene chiamato più di una volta con gli stessi parametri di ingresso. Ad esempio, la rimozione di un elemento da un insieme può essere considerata operazione idempotente sul set.

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

Queste definizioni leggermente diverse possono essere conciliate considerando che x nella definizione matematica rappresenta lo stato di un oggetto, e f è un'operazione che possono mutare tale oggetto. Ad esempio, si consideri il pitone set e il suo metodo discard . Il metodo <=> rimuove un elemento da un insieme, e non fa nulla se l'elemento non esiste. Quindi:

my_set.discard(x)

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

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

Operazioni idempotent sono spesso utilizzati nella progettazione di protocolli di rete, in cui una richiesta di eseguire un'operazione è garantito per accadere, almeno una volta, ma potrebbe anche accadere più di una volta. Se l'operazione è idempotente, allora non c'è nulla di male nel eseguire l'operazione due o più volte.

Si veda l'articolo di Wikipedia su idempotence per ulteriori informazioni.


La risposta di cui sopra in precedenza aveva alcuni esempi non corrette e fuorvianti. Commenti qui sotto scritte prima Aprile 2014 si riferiscono ad una revisione più vecchia.

Altri suggerimenti

Un'operazione idempotente può essere ripetuto un numero arbitrario di volte e il risultato sarà lo stesso come se fosse stata effettuata una sola volta. In aritmetica, aggiungendo zero ad un numero è idempotente.

idempotence si parla molto nel contesto dei servizi web "riposante". REST cerca di massimo effetto leva HTTP per dare programmi di accesso ai contenuti web, e di solito è impostato in contrasto con i servizi Web basati su SOAP, che ha appena tunnel remoto Procedura servizi di stile di chiamata all'interno le richieste HTTP e le risposte.

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

idempotence svolge un ruolo importante nel REST. Se si ottiene una rappresentazione di una risorsa riposo (ad esempio, ottenere un'immagine jpeg da Flickr), e l'operazione non riesce, si può solo ripetere ancora e ancora il GET fino a quando l'operazione riesce. Per il servizio web, non importa quante volte l'immagine si ottiene. Allo stesso modo, se si utilizza un servizio Web RESTful per aggiornare le informazioni dell'account Twitter, è possibile inserire le nuove informazioni tutte le volte che sarà necessario al fine di ottenere la conferma dal servizio web. PUT-ing mille volte è lo stesso di PUT-ing una volta. Allo stesso modo DELETE-zione un REST risorsa mille volte è lo stesso che l'eliminazione di una volta. Idempotence rende così molto più facile costruire un servizio web che è resistente agli errori di comunicazione.

Per ulteriori approfondimenti: RESTful Web Services , da Richardson e Ruby (idempotence è discusso a pagina 103-104), e tesi di dottorato di Roy Fielding su REST . Fielding è stato uno dei di HTTP 1.1, RFC-2616, che parla di idempotence in gli autori sezione 9.1.2 .

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

idempotence significa che applicando un'operazione volta o applicandolo più volte ha lo stesso effetto.

Esempi:

  • Moltiplicazione per zero. Non importa quante volte lo si fa, il risultato è ancora pari a zero.
  • L'impostazione di un flag booleano. Non importa quante volte lo si fa, rimane impostato il flag.
  • Eliminazione di una riga da una base di dati con un dato ID. Se si tenta di nuovo, la fila è ancora andato.

funzioni pure (funzioni senza effetti collaterali) allora idempotency implica che f (x) = f (f (x)) = f (f (f (x))) = f ( f (f (f (x)))) = ...... per tutti i valori di x

funzioni con effetti collaterali , idempotency implica inoltre che effetti collaterali aggiuntivi saranno causate dalla prima applicazione. Si può prendere in considerazione lo stato del mondo per essere un ulteriore parametro di "nascosto" per la funzione, se volete.

Si noti che in un mondo in cui è stato azioni concorrenti in corso, è possibile che le operazioni si pensava fossero idempotente cessare di essere così (per esempio, un altro thread potrebbe disinserire il valore del flag booleano nell'esempio di cui sopra). In pratica ogni volta che avete la concorrenza e lo stato mutevole, è necessario pensare molto più attentamente su idempotenza.

idempotenza è spesso una proprietà utile nella costruzione di sistemi robusti. Ad esempio, se v'è il rischio che si potrebbe ricevere un messaggio duplicato da una terza parte, è utile avere l'atto gestore di messaggi come un'operazione idempotent in modo che l'effetto messaggio avviene solo una volta.

Un'operazione idempotente produce il risultato nello stesso stato, anche se lo si chiama più di una volta, a condizione che si passa negli stessi parametri.

Volevo solo di buttare fuori un caso d'uso reale che dimostra idempotence. In JavaScript, dite si definisce un gruppo di classi del modello (come nel modello MVC). Il modo in cui questo viene spesso implementata è funzionalmente equivalente a qualcosa di simile (esempio di base):

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

  return Model;
}

Si potrebbe quindi definire nuove classi in questo modo:

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

Ma se si dovesse cercare di ottenere la classe User via model('user'), da qualche altra parte nel codice, si fallirebbe:

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

I due costruttori <=> sarebbero diverse. Cioè,

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

Per rendere più idempotent , si sarebbe solo aggiungere una sorta di meccanismo di caching, in questo modo:

var collection = {};

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

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

  collection[name] = Model;
  return Model;
}

Con l'aggiunta di caching, ogni volta che avete fatto <=> sarà lo stesso oggetto, e quindi è idempotente. Quindi:

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

Un'operazione idempotente è un'operazione, azione o richiesta che può essere applicato più volte senza cambiare il risultato, vale a dire lo stato del sistema, oltre l'applicazione iniziale.

ESEMPI (web app CONTESTO):

idempotente: Rendendo più richieste identiche ha lo stesso effetto di rendere 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 sarà solo risultato di sempre in quel messaggio sia nello stato "aperto". Si tratta di un'operazione idempotente. La prima volta che si mette un aggiornamento a una risorsa utilizzando le informazioni che non corrisponde la risorsa (lo stato del sistema), lo stato del sistema cambierà come la risorsa viene aggiornato. Se uno mette lo stesso aggiornamento a una risorsa più volte poi le informazioni nell'aggiornamento corrisponderà le informazioni già presenti nel sistema su ogni PUT, e si verificherà alcun cambiamento allo stato del sistema. PUT ripetute con le stesse informazioni sono idempotente: il primo PUT può cambiare lo stato del sistema, PUTs successivi non dovrebbe.

Non idempotente: Se un'operazione provoca sempre un cambiamento di stato, come la pubblicazione lo stesso messaggio a un utente più e più volte, risultando in un nuovo messaggio inviato e memorizzato nel database ogni volta, diciamo che l'operazione è NON idempotente.

NULLIPOTENT: Se un'operazione non ha effetti collaterali, come la visualizzazione di informazioni puramente su una pagina web senza alcun cambiamento in una banca dati (in altre parole, si sta solo leggendo il database), diciamo l'operazione è NULLIPOTENT. Tutto diventa dovrebbe essere nullipotent.

Quando si parla di stato del sistema che stiamo ovviamente ignorando gli effetti si spera innocui ed inevitabili come la registrazione e la diagnostica.

idempotent Operazioni: operazioni che non hanno effetti collaterali se più volte eseguiti.
Esempio : Un'operazione che recupera i valori da una risorsa di dati e dire, lo stampa
Non idempotent Operazioni: le operazioni che potrebbero causare qualche danno se eseguito più volte. (Come cambiano alcuni valori o stati)
Esempio: Un'operazione che si ritira da un conto bancario

Un bel dettagliate e tecniche risposte. Solo l'aggiunta di una semplice definizione.

  

idempotent = Ri-eseguibile

Ad esempio, Create funzionamento in sé non è garantito per funzionare senza errore se eseguita più di una volta. Ma se c'è un'operazione CreateOrUpdate allora afferma ri-macchinabilità (idempotenza).

Un'operazione idempotente su un insieme lascia suoi membri invariato quando applicate una o più volte.

Può essere un'operazione unaria come assoluto (x) dove x appartiene ad un gruppo di numeri interi positivi. Qui assoluto (assoluto (x)) = x.

Può essere un'operazione binaria come unione di un set con sé sarebbe sempre tornare lo stesso set.

applausi

E 'qualsiasi operazione che ogni risultato ennesima si tradurrà in un'uscita corrispondente al valore del primo risultato. Per esempio il valore assoluto di -1 è 1. Il valore assoluto del valore assoluto di -1 è 1. Il valore assoluto del valore assoluto del valore assoluto di -1 è 1. E così via.

Si veda anche: Quando sarebbe un momento davvero stupido per usare la ricorsione

?

il mio 5c: Nel integrazione e messa in rete l'idempotenza è molto importante. Diversi esempi tratti dalla vita reale: Immaginate, noi forniamo i dati nel sistema di destinazione. I dati forniti da una sequenza di messaggi. 1. Che cosa accadrebbe se la sequenza è mescolato in canale? (Come i pacchetti di rete sempre fare :)). Se il sistema di destinazione è idempotente, il risultato non sarà diverso. Se il sistema di destinazione dipende dal giusto ordine nella sequenza, dobbiamo implementare resequencer sul sito di destinazione, che ristabilire l'ordine giusto. 2. Che cosa accadrebbe se non ci sono le copie dei messaggi? Se il canale del sistema di destinazione non riconosce tempestivo, il sistema di origine (o il canale stesso) di solito invia un'altra copia del messaggio. Di conseguenza possiamo avere messaggio duplicato sul lato sistema di destinazione. Se il sistema di destinazione è idempotente, si prende cura di esso e risultato non sarà diverso. Se il sistema di destinazione non è idempotente, dobbiamo implementare DeDuplicator sul lato sistema di destinazione del canale.

In breve , le operazioni idempotente significa che l'operazione non darà luogo a risultati diversi, non importa quante volte si opera le operazioni idempotenti.

Ad esempio, secondo la definizione della specifica di HTTP, GET, HEAD, PUT, and DELETE sono operazioni idempotenti; tuttavia POST and PATCH non lo sono. Ecco perché a volte POST è sostituito dal PATCH.

riprovare-safe.

di solito è il modo più semplice per capire il suo significato in informatica.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top