Co to jest idempotentna operacja?


Odpowiedzi:


964

W informatyce operacja idempotentna to taka, która nie ma dodatkowego efektu, jeśli jest wywoływana więcej niż jeden raz z tymi samymi parametrami wejściowymi. Na przykład usunięcie elementu ze zbioru można uznać za idempotentną operację na zestawie.

W matematyce operacją idempotentną jest operacja, w której f (f (x)) = f (x) . Na przykład abs()funkcja jest idempotentna, ponieważ abs(abs(x)) = abs(x)dla wszystkich x.

Te nieco różne definicje można pogodzić, biorąc pod uwagę, że x w definicji matematycznej reprezentuje stan obiektu, a f jest operacją, która może mutować ten obiekt. Na przykład rozważmy Pythonset i jego discardmetodę. discardMetoda usuwa element z zestawu, i nie robi nic, jeśli element nie istnieje. Więc:

my_set.discard(x)

ma dokładnie taki sam efekt jak dwukrotne wykonanie tej samej operacji:

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

Idempotentne operacje są często używane przy projektowaniu protokołów sieciowych, w których gwarantuje się, że żądanie wykonania operacji nastąpi co najmniej raz, ale może się także zdarzyć więcej niż raz. Jeśli operacja jest idempotentna, wykonywanie operacji dwa lub więcej razy nie jest szkodliwe.

Aby uzyskać więcej informacji, zobacz artykuł w Wikipedii na temat idempotencji .


Powyższa odpowiedź zawierała wcześniej niepoprawne i mylące przykłady. Komentarze napisane przed kwietniem 2014 r. Odnoszą się do starszej wersji.


6
Przykład: ponieważ odpowiedź powyżej stwierdza, że Idempotent operations are often used in the design of network protocolsjest to powiązany przykład ** GET nie powinien niczego zmieniać na serwerze, więc GET jest idempotentny. W kontekście HTTP / serwletu oznacza to, że to samo żądanie może zostać wysłane dwukrotnie bez negatywnych konsekwencji. ** POST NIE jest idempotentny.
KNU

1
Czy „bezpaństwowiec” jest synonimem „idempotent”?
Michael Osofsky,

2
@MichaelOsofsky: Nie, w setprzykładzie Pythona w odpowiedzi ustawiony obiekt wyraźnie ma stan i oferuje także pewne idempotentne operacje, takie jak discard.
Greg Hewgill,

1
@MichaelOsofsky, discardmogą także być realizowane w sposób bezpaństwowca przez obejmującym państwa w zwracanej wartości: discard([my_set, x]) = [my_new_set, x]. Więc możesz to zrobić discard(discard([my_set, x])). Zauważ, że [my_new_set, x]jest to tylko jeden argument, a jego typ to 2-krotny.
Pacerier,

2
@Zielony Używając terminu ten sam efekt w kontekście impotencji, oznacza to, że wynik jest taki sam, a nie działanie . Wywołanie discard(x)za drugim razem będzie miało taki sam efekt jak wywołanie za pierwszym razem: Zestaw nie będzie już zawierał x. Obliczeniowa idempotencja dotyczy niezawodności systemu. Ponieważ rzeczy mogą zawieść (np. Awaria sieci), kiedy zostanie wykryta awaria, w jaki sposób możesz odzyskać? Najłatwiejszym odzyskiem jest po prostu powtórzenie tego, ale działa to tylko wtedy, gdy powtórzenie tego jest idempotentne. Np. discard(x)Jest idempotentny, ale pop()nie jest. Chodzi o odzyskiwanie po błędzie.
Andreas

138

Idempotentną operację można powtórzyć dowolną liczbę razy, a wynik będzie taki sam, jak gdyby wykonano ją tylko raz. W arytmetyce dodawanie zera do liczby jest idempotentne.

O idempotencji mówi się wiele w kontekście usług sieciowych „RESTful”. REST dąży do maksymalnego wykorzystania protokołu HTTP, aby zapewnić programom dostęp do treści internetowych, i zwykle jest ustawiony w przeciwieństwie do usług internetowych opartych na SOAP, które tylko tunelują usługi stylu wywołań procedur zdalnych w żądaniach i odpowiedziach HTTP.

REST organizuje aplikację internetową w „zasoby” (jak użytkownik Twittera lub obraz Flickr), a następnie używa czasowników HTTP POST, PUT, GET i DELETE do tworzenia, aktualizowania, czytania i usuwania tych zasobów.

Idempotencja odgrywa ważną rolę w REST. Jeśli GET reprezentuje zasób REST (np. GET obraz JPEG z Flickr) i operacja się nie powiedzie, możesz po prostu powtarzać GET raz za razem, aż operacja się powiedzie. W przypadku usługi internetowej nie ma znaczenia, ile razy obraz zostanie pobrany. Podobnie, jeśli korzystasz z usługi sieci Web RESTful do aktualizacji informacji o koncie na Twitterze, możesz ZŁOŻYĆ nowe informacje tyle razy, ile potrzeba, aby uzyskać potwierdzenie z usługi sieci. ZAŁOŻENIE go tysiąc razy jest tym samym, co ZŁOŻENIE raz. Podobnie usuwanie tysiąca zasobów REST jest tym samym, co jednorazowe usuwanie. Idempotencja znacznie ułatwia konstruowanie serwisu odpornego na błędy komunikacyjne.

Dalsza lektura: RESTful Web Services autorstwa Richardsona i Ruby (idempotencja omówiona na stronie 103-104) oraz rozprawa doktorska Roya Fieldinga na temat REST . Fielding był jednym z autorów HTTP 1.1, RFC-2616, który mówi o idempotencji w sekcji 9.1.2 .


Jasne i proste. Jest to jednak tylko jedna interpretacja idempotenta.
Pacerier,

10
„idempotencja” jest mocno przeciążonym słowem, ponieważ brzmi wielce i ma wystarczająco dużo znaków, aby przejść czek na sesquipedalian. Gdyby Benjamin Peirce wybrał prostsze słowo, nie mielibyśmy dzisiaj tego pytania.
Pacerier

2
Jak to zrozumieć: Podobnie USUWANIE zasobu REST tysiąc razy jest równoznaczne z jego jednorazowym usunięciem ? Nie można ponownie usunąć zasobu, jeśli jest już usunięty.
Zielony,

1
@Zielony, ale nie usuwasz go za pierwszym razem. Ci wysłać żądanie usunięcia . Ważne jest to, że możesz wysłać tyle żądań, ile chcesz.
Caleth,

1
@JimFerrans Widzę. Pomyślałem, że może istnieć jakiś powód związany z funkcjonalnością (wbudowany w sam HTTP), dlaczego PUT może być ponownie wysłany bez obaw, podczas gdy POST nie. Teraz wydaje się, że jesteśmy po prostu zobowiązani do przestrzegania standardów HTTP, a zachowanie jest całkowicie oparte na sposobie implementacji serwera
mangusta,

109

Bez względu na to, ile razy wywołasz operację, wynik będzie taki sam.


8
Słyszałem idempotent zdefiniowany jako jedno lub oba z poniższych: 1) Dla danego zestawu danych wejściowych zawsze zwróci to samo wyjście. 2) Nie powoduje żadnych skutków ubocznych. Moje pytanie brzmi: jeśli funkcja jest zgodna z numerem 1, ale nie z 2, ponieważ powoduje efekt uboczny niezwiązany z obliczeniami (na przykład rejestruje żądanie w magazynie danych), czy nadal jest uważany za idempotentny?
Keith Bennett

12
Wynik wywołania operacji musi obejmować stan systemu, więc jeśli operacja ma jakiś skumulowany efekt uboczny, nie jest idempotentna; jednak jeśli efekt uboczny pozostawia system w tym samym stanie, bez względu na to, ile razy wywoływana jest operacja, może być idempotentny.
Robert

4
Krótko i słodko, uwielbiam tego rodzaju odpowiedź. Nie jestem pewien, dlaczego muszę ciągle szukać tego terminu, to taki, który po prostu nie zostaje ze mną.
Prancer

1
@KeithBennett, Druga definicja jest nieprawidłowa. „Brak skutków ubocznych” nie oznacza idempotent. Funkcje idempotentne mogą mieć skutki uboczne. Np. MySQL truncatei delete.
Pacerier,

Wynik będzie taki sam (tj. Stan systemu), ale odpowiedź może się różnić (tj. Kody stanu HTTP w usłudze REST).
G. Steigert,

50

Idempotencja oznacza, że ​​jednorazowe zastosowanie lub wielokrotne zastosowanie ma ten sam efekt.

Przykłady:

  • Mnożenie przez zero. Bez względu na to, ile razy to zrobisz, wynik będzie nadal wynosił zero.
  • Ustawienie flagi logicznej. Bez względu na to, ile razy to robisz, flaga pozostaje ustawiona.
  • Usuwanie wiersza z bazy danych o danym identyfikatorze. Jeśli spróbujesz jeszcze raz, wiersz nadal nie ma.

W przypadku funkcji czystych (funkcje bez efektów ubocznych) idempotencja oznacza, że ​​f (x) = f (f (x)) = f (f (f (x))) = f (f (f (f (x))) ) = ...... dla wszystkich wartości x

W przypadku funkcji z efektami ubocznymi idempotencja oznacza ponadto, że po pierwszym zastosowaniu nie zostaną wywołane żadne dodatkowe skutki uboczne. Jeśli chcesz, możesz uznać stan świata za dodatkowy „ukryty” parametr funkcji.

Zauważ, że w świecie, w którym toczą się równoległe akcje, może się okazać, że operacje, które wydawały się idempotentne, przestaną być takie (na przykład inny wątek może zmienić wartość flagi boolowskiej w powyższym przykładzie). Zasadniczo za każdym razem, gdy masz stan współbieżności i zmienności, musisz ostrożniej przemyśleć idempotencję.

Idempotencja jest często użyteczną właściwością w budowaniu niezawodnych systemów. Na przykład, jeśli istnieje ryzyko, że możesz otrzymać zduplikowaną wiadomość od strony trzeciej, pomocne jest, aby program obsługi wiadomości działał jak idempotentna operacja, aby efekt wiadomości wystąpił tylko raz.


1
Jeśli chodzi o czyste funkcje f(x) = f(f(x)), czy masz na myśli, że f(x){return x+1;}nie jest to czysta funkcja? ponieważ f(x) != f(f(x)): f(1)daje 2, a f(2)daje 3.
Pacerier

1
@Pacerier Nie, @mikera mówi czysto i idempotentnie f(x) = f(f(x)). Ale, jak wspomniano @GregHewgill, aby ta definicja miała sens, należy ją traktować xjako obiekt i foperację, która mutuje stan obiektu (tj. Wyjście fjest zmutowane x).
Justin J Stark


16

Chciałem tylko rzucić prawdziwy przypadek użycia, który pokazuje idempotencję. W JavaScript powiedz, że definiujesz kilka klas modeli (jak w modelu MVC). Sposób, w jaki jest to często implementowane, jest funkcjonalnie równoważny do czegoś takiego (przykład podstawowy):

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

  return Model;
}

Następnie możesz zdefiniować nowe klasy w następujący sposób:

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

Ale jeśli spróbujesz przejść przez Userklasę model('user'), z innego miejsca w kodzie, to się nie powiedzie:

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

Te dwa Userkonstruktory byłyby inne. To jest,

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

Aby uczynić go idempotentnym , wystarczy dodać jakiś mechanizm buforowania, taki jak ten:

var collection = {};

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

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

  collection[name] = Model;
  return Model;
}

Dodając buforowanie, za każdym razem model('user')będzie to ten sam obiekt, więc jest idempotentny. Więc:

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

10

Operacja idempotentna to operacja, akcja lub żądanie, które można zastosować wiele razy bez zmiany wyniku, tj. Stanu systemu, poza początkową aplikacją.

PRZYKŁADY (KONTEKST APLIKACJI INTERNETOWEJ):

IDEMPOTENT: Wykonanie wielu identycznych żądań ma taki sam efekt jak wykonanie pojedynczego żądania. Wiadomość w systemie wiadomości e-mail jest otwierana i oznaczana jako „otwarta” w bazie danych. Wiadomość można otworzyć wiele razy, ale ta powtarzająca się czynność spowoduje, że wiadomość będzie w stanie „otwarta”. To jest idempotentna operacja. Przy pierwszym PUT aktualizacji aktualizacji zasobu przy użyciu informacji, które nie są zgodne z zasobem (stan systemu), stan systemu zmieni się wraz z aktualizacją zasobu. Jeśli ktoś PUT wielokrotnie wprowadza tę samą aktualizację do zasobu, to informacje zawarte w aktualizacji będą pasować do informacji znajdujących się już w systemie przy każdym PUT i nie nastąpi zmiana stanu systemu. Powtarzające się PUT z tymi samymi informacjami są idempotentne:

NIE-IDEMPOTENT: Jeśli operacja zawsze powoduje zmianę stanu, na przykład POST wysyłanie tego samego komunikatu do użytkownika w kółko, w wyniku czego nowa wiadomość jest wysyłana i przechowywana w bazie danych za każdym razem, mówimy, że operacja jest NIE-IDEMPOTENTOWA.

NULLIPOTENT: Jeśli operacja nie wywołuje żadnych skutków ubocznych, takich jak zwykłe wyświetlanie informacji na stronie internetowej bez żadnych zmian w bazie danych (innymi słowy, czytasz tylko bazę danych), mówimy, że operacja jest NULLIPOTENT. Wszystkie GET-y powinny być zerowe.

Mówiąc o stanie systemu, oczywiście ignorujemy, miejmy nadzieję, nieszkodliwe i nieuniknione skutki, takie jak rejestrowanie i diagnostyka.


9

Idempotentne operacje: Operacje, które nie wywołują skutków ubocznych, jeśli są wykonywane wielokrotnie.
Przykład : operacja, która pobiera wartości z zasobu danych i powiedzmy, drukuje go.

Operacje niebędące idempotentami: Operacje, które mogłyby spowodować pewne szkody, gdyby były wykonywane wielokrotnie (Gdy zmieniają niektóre wartości lub stany)
Przykład: Operacja, która dokonuje wypłaty z konta bankowego


3
Właściwie zła odpowiedź! w przypadku operacji Idempotent powiedzenie „nie ma skutków ubocznych” jest niewłaściwe. w przypadku operacji niebędących idempotentnymi powiedzenie „wyrządzić krzywdę” jest mylącą odpowiedzią.
Saeed Mohtasham

9

Dość szczegółowe i techniczne odpowiedzi. Wystarczy dodać prostą definicję.

Idempotent = Ponowne uruchomienie

Na przykład Createnie można zagwarantować, że sama operacja będzie działać bez błędów, jeśli zostanie wykonana więcej niż jeden raz. Ale jeśli jest operacja CreateOrUpdate, oznacza to możliwość ponownego uruchomienia (Idempotency).


3
To zwodnicza definicja. możliwość ponownego uruchomienia nie gwarantuje bycia idempotentnym. Operację można ponownie uruchomić, a przy każdym uruchomieniu może dodać dodatkowe efekty do wyniku, aby nie była idempotentna.
Saeed Mohtasham

7

Idempotentna operacja na zestawie pozostawia jego elementy niezmienione, jeśli zostanie zastosowana jeden lub więcej razy.

Może to być jednoargumentowa operacja, taka jak bezwzględna (x), gdzie x należy do zbioru liczb całkowitych dodatnich. Tutaj bezwzględne (bezwzględne (x)) = x.

Może to być operacja binarna, taka jak połączenie zbioru z samym sobą zawsze zwróci ten sam zestaw.

Twoje zdrowie


Operacją idempotentną jest operacja, w której f (f (x)) = f (x). „pozostawia członków bez zmian” nie jest właściwą odpowiedzią.
Saeed Mohtasham

7

Jest to każda operacja, w której co n-ty wynik da wynik zgodny z wartością pierwszego wyniku. Na przykład wartość bezwzględna -1 wynosi 1. Wartość bezwzględna wartości bezwzględnej -1 wynosi 1. Wartość bezwzględna wartości bezwzględnej wartości bezwzględnej -1 wynosi 1. I tak dalej.

Zobacz także: Kiedy naprawdę głupie byłoby użycie rekurencji?


1
to mizerna odpowiedź nawet po 10 latach. +1
snr

2

Dobrym przykładem zrozumienia idempotentnej operacji może być zablokowanie samochodu za pomocą zdalnego klucza.

log(Car.state) // unlocked

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

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

lockjest operacją idempotentną. Nawet jeśli przy każdym uruchomieniu występuje jakiś efekt uboczny lock, np. Mruganie, samochód jest nadal w tym samym stanie zablokowanym, bez względu na to, ile razy uruchamiasz blokadę.


1

my 5c: W integracji i sieci idempotencja jest bardzo ważna. Kilka przykładów z życia: Wyobraź sobie, że dostarczamy dane do systemu docelowego. Dane dostarczane przez sekwencję wiadomości. 1. Co by się stało, gdyby sekwencja została zmiksowana w kanale? (Jak zawsze robią to pakiety sieciowe :)). Jeśli system docelowy jest idempotentny, wynik nie będzie inny. Jeśli system docelowy zależy od właściwej kolejności w sekwencji, musimy zaimplementować sekwencer na stronie docelowej, co przywróci prawidłową kolejność. 2. Co by się stało, gdyby były duplikaty wiadomości? Jeśli kanał systemu docelowego nie potwierdzi na czas, system źródłowy (lub sam kanał) zwykle wysyła kolejną kopię wiadomości. W rezultacie możemy mieć zduplikowany komunikat po stronie systemu docelowego. Jeśli system docelowy jest idempotentny, dba o to i wynik nie będzie inny. Jeśli system docelowy nie jest idempotentny, musimy zaimplementować deduplikator po stronie systemu docelowego kanału.


Idempotencja pojedynczych żądań wysyłanych w oderwaniu od wszelkich innych żądań (lub wszystkiego innego, co zmienia stan systemu), nie jest tym samym, co zmienianie kolejności żądań. Żądanie HTTP PUT i żądanie HTTP DELETE powinny być indywidualnie idempotentne - ale to nie znaczy, że kolejność wywoływania PUT i DELETE pod tym samym adresem URL nie ma znaczenia, ponieważ żądanie PUT może mieć skutki uboczne!
Robin Green,

1

Krótko mówiąc , operacje Idempotent oznaczają, że operacja nie da różnych wyników, bez względu na to, ile razy operujesz operacjami idempotent.

Na przykład zgodnie z definicją specyfikacji HTTP GET, HEAD, PUT, and DELETEsą to operacje idempotentne; jednak POST and PATCHnie są. Dlatego czasami POSTzastępuje się PUT.


-4

spróbuj ponownie.

Jest zwykle najłatwiejszym sposobem zrozumienia jego znaczenia w informatyce.


1
Ponowna próba oznacza coś, co zawiodło po raz pierwszy lub poprzedni. Nie do końca to samo.
Lasse V. Karlsen

Kto zredagował moje pytanie i dał mi głos w dół? To nie jest tekst, który opublikowałem?
teknopaul

Możesz sprawdzić dziennik edycji, klikając link pod odpowiedzią z napisem „edytowany X godzin temu” lub podobny.
Lasse V. Karlsen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.