Odpowiedzi:
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 discard
metodę. discard
Metoda 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.
set
przykładzie Pythona w odpowiedzi ustawiony obiekt wyraźnie ma stan i oferuje także pewne idempotentne operacje, takie jak discard
.
discard
mogą 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.
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.
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 .
Bez względu na to, ile razy wywołasz operację, wynik będzie taki sam.
truncate
i delete
.
Idempotencja oznacza, że jednorazowe zastosowanie lub wielokrotne zastosowanie ma ten sam efekt.
Przykłady:
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.
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.
f(x) = f(f(x))
. Ale, jak wspomniano @GregHewgill, aby ta definicja miała sens, należy ją traktować x
jako obiekt i f
operację, która mutuje stan obiektu (tj. Wyjście f
jest zmutowane x
).
Idempotentna operacja daje wynik w tym samym stanie, nawet jeśli wywołasz go więcej niż jeden raz, pod warunkiem, że podasz te same parametry.
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 User
klasę 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 User
konstruktory 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');
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.
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
Dość szczegółowe i techniczne odpowiedzi. Wystarczy dodać prostą definicję.
Idempotent = Ponowne uruchomienie
Na przykład
Create
nie 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).
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
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?
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
lock
jest 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ę.
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.
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 DELETE
są to operacje idempotentne; jednak POST and PATCH
nie są. Dlatego czasami POST
zastępuje się PUT
.
spróbuj ponownie.
Jest zwykle najłatwiejszym sposobem zrozumienia jego znaczenia w informatyce.
Idempotent operations are often used in the design of network protocols
jest 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.