Co to jest operacja idempotentna?

Co to jest operacja idempotentna?

Author: shA.t, 2009-07-03

15 answers

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

W matematyce, operacja idempotentna jest taka, gdzie f (f (x)) = f (x). Na przykład funkcja abs() jest idempotentna, ponieważ abs(abs(x)) = abs(x) dla wszystkich x.

Te nieco odmienne 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ż Python set i jego metody discard. Metoda discard usuwa element ze zbioru i nie robi nic, jeśli element nie istnieje. Więc:

my_set.discard(x)

Ma dokładnie taki sam efekt jak wykonanie tej samej operacji dwa razy:

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

Operacje Idempotentne są często używane w projektowaniu protokołów sieciowych, gdzie żądanie wykonania operacji jest gwarantowane, że wystąpi co najmniej raz, ale może się zdarzyć również więcej niż jeden raz. Jeśli operacja jest idempotentna, to nie ma szkody w wykonaniu operacji dwa lub więcej razy.

Więcej informacji można znaleźć w artykule Wikipedii na temat idempotence .

powyższa odpowiedź miała wcześniej kilka błędnych i wprowadzających w błąd przykładów. Poniższe komentarze napisane przed kwietniem 2014 r. odnoszą się do starszej wersji.

 723
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-01 19:41:52

Operacja idempotentna może być powtórzona dowolną liczbę razy, a wynik będzie taki sam, jak gdyby została wykonana tylko raz. W arytmetyce dodawanie zera do liczby jest idempotentne.

O Idempotencji mówi się dużo w kontekście "RESTful" Web services. REST stara się maksymalnie wykorzystać HTTP, aby zapewnić programom dostęp do treści internetowych i jest zwykle ustawiony w przeciwieństwie do usług internetowych opartych na SOAP, które po prostu tunelują usługi w stylu zdalnego wywołania procedur wewnątrz żądań HTTP i odpowiedzi.

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, aby utworzyć, zaktualizować, przeczytać i usunąć te zasoby.

Idempotencja odgrywa ważną rolę w odpoczynku. Jeśli otrzymasz reprezentację zasobu REST (np. obraz jpeg z Flickr), a operacja się nie powiedzie, możesz po prostu powtórzyć GET ponownie i ponownie, aż operacja się powiedzie. Do serwisu www, it nie ma znaczenia, ile razy obraz jest zdobyty. Podobnie, jeśli używasz usługi internetowej RESTful do aktualizacji informacji o koncie Twitter, możesz umieścić nowe informacje tyle razy, ile potrzeba, aby uzyskać potwierdzenie z usługi internetowej. Wkładanie go tysiąc razy to to samo, co Wkładanie go raz. Podobnie DELETE-tysiąckrotne usunięcie zasobu REST jest tym samym, co usunięcie go raz. Idempotence znacznie ułatwia więc zbudowanie serwisu www odpornego na komunikację błędy.

[[0]} dalsze czytanie: RESTful Web Services , autorstwa Richardsona i Ruby (idempotence jest omówione na stronie 103-104), oraz rozprawę doktorską Roya Fieldinga na temat REST. Fielding był jednym z autorów HTTP 1.1, RFC-2616, który mówi o idempotencji w sekcja 9.1.2.
 107
Author: Jim Ferrans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-11 13:26:35

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

 79
Author: Robert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-25 17:19:03

Idempotencja oznacza, że zastosowanie operacji raz lub kilka razy ma ten sam efekt.

Przykłady:

  • mnożenie przez zero. Bez względu na to, ile razy to zrobisz, wynik nadal jest zerowy.
  • Ustawianie flagi logicznej. Nieważne ile razy to zrobisz, flaga pozostanie ustawiona.
  • usunięcie wiersza z bazy danych o podanym ID. Jeśli spróbujesz jeszcze raz, rząd nadal zniknie.

For pure functions (functions with no side następnie idempotencja implikuje, że f(x) = f(F(x)) = F(f(x))) = F(F(F(x)))=...... dla wszystkich wartości x

Dla funkcji z efektami ubocznymi idempotencja oznacza ponadto, że po pierwszej aplikacji nie będą wywoływane żadne dodatkowe efekty uboczne. Możesz uznać stan świata za dodatkowy" Ukryty " parametr do funkcji, jeśli chcesz.

Zauważ, że w świecie, w którym masz współbieżne działania, może się okazać, że operacje thought were idempotent przestaje być tak (na przykład, inny wątek może wyłączyć wartość flagi boolean w powyższym przykładzie). Zasadniczo za każdym razem, gdy masz współbieżny i zmienny stan, musisz bardziej dokładnie przemyśleć idempotencję.

Idempotency jest często przydatną właściwością w budowaniu solidnych systemów. Na przykład, jeśli istnieje ryzyko, że otrzymasz duplikat wiadomości od osoby trzeciej, pomocne jest, aby obsługa wiadomości działała jako operacja idempotentna, więc że efekt wiadomości występuje tylko raz.

 41
Author: mikera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-05 08:40:33

Operacja idempotent generuje wynik w tym samym stanie, nawet jeśli wywołasz go więcej niż raz, pod warunkiem podania tych samych parametrów.

 22
Author: Caleb Huitt - cjhuitt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-09 14:43:58

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

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

  return Model;
}

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

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

Ale gdybyś spróbował dostać User klasę przez model('user'), z innego miejsca w kodzie, to by się nie udało:

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

Ci dwaj User konstruktorzy byliby inni. Czyli

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

Aby zrobić to idempotent , wystarczy dodać jakiś mechanizm buforowania, taki jak:

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, gdy to zrobisz {[7] } będzie to ten sam obiekt, a więc będzie idempotentny. Więc:

model('user') === model('user');
 10
Author: Lance Pollard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-09 01:30:44

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

operacje bez Idempotentne: operacje, które spowodowałyby pewną szkodę, gdyby były wykonywane wielokrotnie. (Ponieważ zmieniają niektóre wartości lub stany)
Przykład: Operacja wypłaty z konta bankowego

 8
Author: Mahmoud Abou-Eita,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-06 14:42:39

Operacja idempotent nad zestawem pozostawia jego elementy bez zmian, gdy zostaną zastosowane jeden lub więcej razy.

Może być operacją jednoargumentową jak absolute (x) gdzie x należy do zbioru dodatnich liczb całkowitych. Tutaj absolute(absolute(X)) = x.

Może to być operacja binarna, jak związek zbioru z samym sobą zawsze zwróci ten sam zbiór.

Cheers

 6
Author: Arnkrishn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-03 01:26:46

Operacja idempotentna jest operacją, akcją lub żądaniem, które można zastosować wielokrotnie bez zmiany wyniku, tj. stanu systemu, poza początkową aplikacją.

PRZYKŁADY (WEB APP CONTEXT):

NULLIPOTENT: Jeśli operacja nie ma żadnych skutków ubocznych, takich jak wyświetlanie informacji na stronie internetowej bez żadnych zmian w bazie danych (innymi słowy, czytasz tylko bazę danych), mówimy, że operacja jest zerowa. / Align = "left" / W przeciwnym razie użyj POST.

IDEMPOTENT: Wiadomość w systemie wiadomości e-mail jest otwierana i oznaczana jako "otwarta" w bazie danych. Można otworzyć wiadomość wiele razy, ale ta powtarzająca się akcja spowoduje, że wiadomość będzie w stanie "otwartym". To jest idempotentna operacja.

NON-IDEMPOTENT: Jeśli operacja zawsze powoduje zmianę stanu, na przykład wysyłanie tej samej wiadomości do użytkownika w kółko, co skutkuje wysyłaniem nowej wiadomości i przechowywaniem jej w bazie danych za każdym razem, powiedzmy, że operacja nie jest IDEMPOTENTNA.

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

 6
Author: nmit026,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-07 02:48:01

Dość szczegółowe i techniczne odpowiedzi. Dodaję tylko prostą definicję.

Idempotent = Re-runnable

Na przykład, Create operacja sama w sobie nie jest gwarantowana bez błędów, jeśli zostanie wykonana więcej niż jeden raz. Ale jeśli istnieje operacja CreateOrUpdate, to określa ona re-runnability (Idempotency).

 6
Author: Manish Basantani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-13 10:59:41

Jest to dowolna operacja polegająca na tym, że każdy n-ty wynik spowoduje wyjście pasujące do wartości 1.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 -1 wynosi 1. I tak dalej.

Zobacz także: kiedy byłby naprawdę głupi czas na użycie rekurencji?

 5
Author: Oorang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-03 01:41:01

Metody Idempotentne

Metoda idempotentna jest metodą, która przyniesie te same wyniki niezależnie od tego, ile razy zostanie wywołana.

  • Metoda GET jest idempotentna, ponieważ wiele wywołań do zasobu GET zawsze zwróci tę samą odpowiedź.

  • Metoda PUT jest idempotentna, ponieważ wielokrotne wywołanie metody PUT zaktualizuje ten sam zasób i nie zmieni wyniku.

  • {[2] } nie jest idempotentna, a wywołanie Metoda POST wielokrotnie może mają różne wyniki i spowodują tworzenie nowych zasobów.

  • DELETE jest idempotentny, ponieważ gdy zasób zostanie usunięty, zniknie i wielokrotne wywołanie metody nie zmieni wyniku.

 5
Author: BERGUIGA Mohamed Amine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-25 17:18:12

Moje 5c: W integracji i sieci idempotencja jest bardzo ważna. Kilka przykładów z prawdziwego życia: Wyobraź sobie, dostarczamy dane do systemu docelowego. Dane dostarczane przez sekwencję komunikatów. 1. Co by się stało, gdyby Sekwencja była mieszana w kanale? (Jak pakiety sieciowe zawsze:)). Jeśli system docelowy jest idempotentny, wynik nie będzie inny. Jeśli system docelowy zależy od odpowiedniej kolejności w sekwencji, musimy zaimplementować resequencer na stronie docelowej, co Przywróć właściwą kolejność. 2. Co by się stało, gdyby wiadomość była duplikowana? Jeśli kanał docelowego systemu nie potwierdzi terminowości, system źródłowy (lub sam kanał) zazwyczaj wysyła kolejną kopię wiadomości. W rezultacie możemy mieć duplikat wiadomości po stronie docelowego systemu. Jeśli system docelowy jest idempotentny, dba o niego i wynik nie będzie inny. Jeśli system docelowy nie jest idempotentny, musimy zaimplementować deduplikator po stronie systemu docelowego kanał.

 0
Author: Leonid Ganeline,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-07 16:11:59

W skrócie , Operacje Idempotentne oznaczają, że operacja nie przyniesie różnych wyników bez względu na to, ile razy wykonasz operacje idempotentne.

Na przykład, zgodnie z definicją specyfikacji HTTP, {[0] } są operacjami idempotentnymi, jednak POST and PATCH nie są. Dlatego czasami POST jest zastępowany przez patcha.

 0
Author: Marcus Thornton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-25 08:50:07

Spróbuj ponownie.

Jest zwykle najprostszym sposobem na zrozumienie jego znaczenia w informatyce.

 -2
Author: teknopaul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-09 10:23:48