İdempotent operasyon nedir?


Yanıtlar:


964

Hesaplamada, idempotent işlem, aynı giriş parametreleriyle birden fazla çağrıldığında ek bir etkisi olmayan bir işlemdir. Örneğin, bir öğeyi kümeden kaldırmak kümede idempotent bir işlem olarak kabul edilebilir.

Matematikte, idempotent bir işlem f (f (x)) = f (x) 'dir . Örneğin, abs()işlev idempotent çünkü abs(abs(x)) = abs(x)herkes için x.

Bu biraz farklı tanımlar , matematiksel tanımdaki x'in bir nesnenin durumunu temsil ettiği ve f'nin bu nesneyi değiştirebilen bir işlem olduğu düşünülerek uzlaştırılabilir . Örneğin, Python'uset ve discardyöntemini düşünün . discardYöntem kümesinden bir öğe kaldırır ve eleman yoksa hiçbir şey yapmaz. Yani:

my_set.discard(x)

aynı işlemi iki kez yapmakla tamamen aynı etkiye sahiptir:

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

İdempotent işlemler genellikle bir işlem gerçekleştirme talebinin en az bir kez gerçekleşeceği garanti edilen, ancak bir kereden fazla da olabileceği ağ protokollerinin tasarımında kullanılır. Operasyon idempotent ise, operasyonun iki veya daha fazla kez yapılmasında herhangi bir zarar yoktur.

Daha fazla bilgi için idempotence hakkındaki Wikipedia makalesine bakın .


Yukarıdaki cevap daha önce bazı yanlış ve yanıltıcı örneklere sahipti. Aşağıda Nisan 2014'ten önce yazılan yorumlar daha eski bir revizyona işaret etmektedir.


6
Örnek: Yukarıdaki yanıt Idempotent operations are often used in the design of network protocolsburada ilişkili bir örnek olduğunu belirttiğinden ** GET'in sunucudaki hiçbir şeyi değiştirmediği varsayılır, bu nedenle GET, idempotenttir. HTTP / servlet bağlamında, aynı isteğin olumsuz sonuç vermeden iki kez yapılabileceği anlamına gelir. ** POST idempotent DEĞİLDİR.
KNU

1
"Durumsuz", "idempotent" ile eşanlamlı mıdır?
Michael Osofsky

2
@MichaelOsofsky: Hayır, yanıttaki Python setörneğinde, ayarlanan nesnenin açıkça durumu vardır ve ayrıca bazı idempotent işlemler sunar discard.
Greg Hewgill

1
@MichaelOsofsky, discardaynı zamanda dönüş değeri durumunu kapsayan bir bilgisi olmayan bir şekilde uygulanabilir: discard([my_set, x]) = [my_new_set, x]. Böylece yapabilirsiniz discard(discard([my_set, x])). Not [my_new_set, x]olan sadece bir argüman ve tip 2-lü olduğunu.
Pacerier

2
@Yeşil İktidarsızlık bağlamında aynı etki terimini kullanırken, sonucun eylem değil aynı olduğu anlamına gelir . Arayan discard(x)seti artık içerecektir: ikinci kez ilk kez çağırmak aynı etkiye sahip olacaktır x. Hesaplama idempotence bir sistemin sağlamlığı ile ilgilidir. İşler başarısız olabileceğinden (örn. Ağ kesintisi), bir hata algılandığında nasıl iyileşirsiniz? En kolay kurtarma sadece tekrar yapmaktır, ancak bu sadece tekrar yapmak idempotent olduğunda işe yarar. Örneğin discard(x), idempotent, ama pop()değil. Her şey hata kurtarma ile ilgilidir.
Andreas

138

Bir idempotent işlem keyfi sayıda tekrar edilebilir ve sonuç sadece bir kez yapılmış gibi olur. Aritmetik olarak, bir sayıya sıfır eklemek idempotenttir.

İdempotence "RESTful" web hizmetleri bağlamında çok şey konuşuluyor. REST, programlara web içeriğine erişim sağlamak için HTTP'den maksimum düzeyde yararlanmaya çalışır ve genellikle HTTP istekleri ve yanıtları içindeki uzaktan yordam çağrı stili hizmetlerini tünelleyen SOAP tabanlı web hizmetlerinin aksine ayarlanır.

REST bir web uygulamasını "kaynaklar" halinde (bir Twitter kullanıcısı veya bir Flickr görüntüsü gibi) düzenler ve daha sonra bu kaynakları oluşturmak, güncellemek, okumak ve silmek için POST, PUT, GET ve DELETE HTTP fiillerini kullanır.

İdempotence, REST'te önemli bir rol oynar. Bir REST kaynağının temsilini ALIN (örn. Flickr'dan bir jpeg görüntüsü ALIN) ve işlem başarısız olursa, işlem başarılı olana kadar GET'i tekrar tekrar tekrarlayabilirsiniz. Web servisine, görüntünün kaç kez alındığı önemli değildir. Aynı şekilde, Twitter hesap bilgilerinizi güncellemek için RESTful bir web hizmeti kullanıyorsanız, web hizmetinden onay almak için yeni bilgileri gerektiği kadar koyabilirsiniz. Binlerce kez koymak, bir kez koymakla aynıdır. Benzer şekilde bir REST kaynağını binlerce kez silmek, bir kez silmekle aynıdır. Idempotence böylece iletişim hatalarına dayanıklı bir web hizmeti oluşturmayı kolaylaştırır.

İlave okumalar: RESTful Web Services , Richardson ve Ruby (idempotence sayfa 103-104'te tartışılmıştır) ve Roy Fielding'in REST üzerine doktora tezi . Fielding, bölüm 9.1.2'deki idempotence hakkında konuşan HTTP 1.1, RFC-2616'nın yazarlarından biriydi .


Açık ve anlaşılır. Yine de bu, idempotent'in sadece bir yorumudur.
Pacerier

10
"idempotence" çok aşırı yüklenmiş bir kelimedir, çünkü görkemli geliyor ve seskipedalian kontrolünü geçmek için yeterli karaktere sahip. Eğer Benjamin Peirce daha basit sondaj kelime seçmişti, biz bugün bile bu soruyu olmazdı.
Pacerier

2
Nasıl Anlaşılır: Benzer şekilde bir REST kaynağını binlerce kez silmek, bir kez silmekle aynı mıdır? Önceden silinmişse kaynağı tekrar silemezsiniz.
Yeşil

1
@Green ama yok İlk seferinde silin. Sen bir silme isteği göndermek . Önemli olan, istediğiniz kadar istek gönderebilmenizdir.
Caleth

1
@JimFerrans Anlıyorum. POST olamazken neden PUT endişe olmadan yeniden gönderilebilir (HTTP kendisi yerleşik) bazı işlevsellik ile ilgili bir neden olabilir düşündüm. Şimdi sadece HTTP standartlarına
uymamız gerekiyor

109

Operasyonu kaç kez çağırırsanız yapın, sonuç aynı olacaktır.


8
Aşağıdakilerden biri veya her ikisi olarak tanımlanan idempotent duydum: 1) Belirli bir girdi seti için her zaman aynı çıktıyı döndürür. 2) Herhangi bir yan etki oluşturmaz. Benim sorum, eğer bir fonksiyon # 1 ile uyumlu ise, ancak # 2 ile uyumlu değilse, hesaplama ile ilgisi olmayan bir yan etki ile sonuçlandığı için (örneğin, bir veri deposuna isteği kaydeder), hala idempotent olarak mı değerlendirilir?
Keith Bennett

12
Bir işlemi çağırmanın sonucu sistemin durumunu içermelidir, bu nedenle işlemin kümülatif bir yan etkisi varsa, idempotent değildir; bununla birlikte, yan etki, operasyonun kaç kez çağrıldığından bağımsız olarak sistemi aynı durumda bırakırsa, o zaman idempotent olabilir.
Robert

4
Kısa ve tatlı, bu tür bir cevabı seviyorum. Neden bu terimi sürekli olarak aramam gerektiğinden emin değilim, sadece benimle kalmayan bir terim.
Prancer

1
@KeithBennett, İkinci tanım yanlış. "Yan etki yok" idempotent anlamına gelmez. İdempotent fonksiyonların yan etkileri olabilir. Örneğin MySQL truncateve delete.
Pacerier

Sonuç aynı olacaktır (yani sistem durumu), ancak yanıt değişebilir (yani bir REST hizmetindeki HTTP durum kodları).
G. Steigert

50

İdempotence, bir işlemin bir kez veya birden çok kez uygulanmasının aynı etkiye sahip olduğu anlamına gelir.

Örnekler:

  • Sıfır ile çarpma. Kaç kez yaparsanız yapın sonuç hala sıfırdır.
  • Boole bayrağı ayarlama. Kaç kere yaparsanız yapın bayrak sabit kalır.
  • Veritabanından belirli bir kimliğe sahip bir satırı silme. Tekrar denerseniz, satır hala gitti.

İçin temel işlevleri (herhangi bir yan etki ile fonksiyonları) daha sonra Idempotency bu, f (x) = f (f (x)) = f (f (f (x))) = f (f (f (f (x))) anlamına gelir ) = ...... x'in tüm değerleri için

İçin yan etkileri olan fonksiyonlar , Idempotency ayrıca ek bir yan etki, ilk uygulamadan sonra neden olacağı anlamına gelir. İsterseniz dünyanın durumunu ek bir "gizli" parametre olarak düşünebilirsiniz.

Eşzamanlı eylemlerin devam ettiği bir dünyada, idempotent olduğunu düşündüğünüz işlemlerin bu şekilde durduğunu görebilirsiniz (örneğin, başka bir iş parçacığı yukarıdaki örnekte boole bayrağının değerini ayarlayabilir). Temel olarak eşzamanlılık ve değişebilir durumunuz olduğunda, idempotency hakkında çok daha dikkatli düşünmeniz gerekir.

İdempotency genellikle sağlam sistemlerin inşasında yararlı bir özelliktir. Örneğin, üçüncü bir taraftan yinelenen bir ileti alabilme riski varsa, ileti işleyicisinin bir idempotent işlem olarak davranması yararlı olur, böylece ileti efekti yalnızca bir kez olur.


1
Saf işlevler içinse f(x) = f(f(x)), f(x){return x+1;}bunun saf bir işlev olmadığı anlamına mı geliyorsunuz ? çünkü f(x) != f(f(x)): f(1)2 verirken 3 f(2)verir.
Pacerier

1
@Pacerier Hayır, @mikera saf ve idempotent demek istiyor f(x) = f(f(x)). Ancak @GregHewgill'in belirttiği gibi, bu tanımın anlamlı olması için x, bir nesne olarak ve nesnenin fdurumunu değiştiren bir işlem olarak düşünmelisiniz (yani: çıkışı fmutasyona uğramış bir değerdir x).
Justin J Stark


16

Sadece idempotence gösteren gerçek bir kullanım davası atmak istedim. JavaScript'te, bir grup model sınıfı tanımladığınızı varsayalım (MVC modelinde olduğu gibi). Bunun sıklıkla uygulanma şekli işlevsel olarak böyle bir şeye eşdeğerdir (temel örnek):

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

  return Model;
}

Daha sonra böyle yeni sınıflar tanımlayabilirsiniz:

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

Ancak, Usersınıfı model('user')kodun başka bir yerinden geçirmeye çalışırsanız başarısız olur:

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

Bu iki Userkurucu farklı olurdu. Yani,

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

Bunu idempotent yapmak için , sadece bir tür önbellek mekanizması eklersiniz, şöyle:

var collection = {};

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

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

  collection[name] = Model;
  return Model;
}

Önbellek ekleyerek, her yaptığınızda model('user')aynı nesne olacaktır ve bu yüzden idempotenttir. Yani:

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

10

Bir idempotent işlem, sonucu, yani sistemin durumunu, ilk uygulamanın ötesinde değiştirmeden birden çok kez uygulanabilen bir işlem, eylem veya istektir.

ÖRNEKLER (WEB UYGULAMA BAĞLAMI):

TANIM: Birden çok özdeş istekte bulunmak, tek bir talepte bulunmakla aynı etkiye sahiptir. E-posta mesajlaşma sistemindeki bir mesaj açılır ve veritabanında "açık" olarak işaretlenir. Mesaj defalarca açılabilir, ancak bu tekrarlanan eylem sadece bu mesajın "açık" durumda olmasına neden olur. Bu idempotent bir ameliyat. Kaynakla eşleşmeyen bilgileri (sistemin durumu) kullanarak bir kaynağa ilk kez güncelleme yaptığında, kaynak güncellendiğinde sistemin durumu değişir. Biri aynı güncelleştirmeyi bir kaynağa art arda PUT yaparsa, güncelleştirmedeki bilgiler her PUT'ta zaten sistemde bulunan bilgilerle eşleşir ve sistemin durumunda herhangi bir değişiklik olmaz. Aynı bilgilere sahip tekrarlanan PUT'lar idempotenttir:

IDEMPOTENT OLMAYAN: Bir işlem her zaman durum değişikliğine neden oluyorsa, aynı iletiyi bir kullanıcıya defalarca POST yapmak gibi, her seferinde veritabanında gönderilen ve saklanan yeni bir iletiyle sonuçlanırsa, işlemin IDEMPOTENT OLMADIĞINI söyleriz.

NULLIPOTENT: Bir işlemin veritabanında herhangi bir değişiklik yapmadan yalnızca bir web sayfasında bilgi görüntülemek gibi bir yan etkisi yoksa (başka bir deyişle, yalnızca veritabanını okuyorsunuz), işlemin NULLIPOTENT olduğunu söylüyoruz. Tüm GET'ler nullipotent olmalıdır.

Sistemin durumu hakkında konuşurken, günlüğe kaydetme ve tanılama gibi umarım zararsız ve kaçınılmaz etkileri göz ardı ediyoruz.


9

Idempotent Operations: Birden fazla kez çalıştırıldığında yan etkisi olmayan işlemler.
Örnek : Bir veri kaynağından değerleri alan ve bunu söyleyen bir işlem, onu

Yazdırır . (Bazı değerleri veya durumları değiştirdikçe)
Örnek: Bir banka hesabından çekilen bir işlem


3
Aslında yanlış bir cevap! İdempotent operasyonu için "yan etkisi yok" demek doğru değildir. idempotent olmayan operasyonlar için "biraz zarar vermek" demek kafa karıştırıcı bir cevaptır.
Saeed Mohtasham

9

Oldukça ayrıntılı ve teknik cevaplar. Sadece basit bir tanım eklemek.

Idempotent = Yeniden çalıştırılabilir

Örneğin, bir Createdefadan fazla yürütülürse , işlemin kendi başına hatasız çalışması garanti edilmez. Ancak bir işlem varsa, CreateOrUpdateyeniden çalıştırılabilirliği (İdempotency) belirtir.


3
Bu aldatıcı bir tanımdır. tekrar çalıştırılabilirlik idempotent olmayı garanti etmez. Bir işlem yeniden çalıştırılabilir ve her çalıştırmada sonuca ek efektler ekleyebilir, böylece idempotent olmaz.
Saeed Mohtasham

7

Bir küme üzerindeki idempotent işlemi, bir veya daha fazla kez uygulandığında üyelerini değiştirmeden bırakır.

X'in bir dizi pozitif tamsayıya ait olduğu mutlak (x) gibi tekli bir işlem olabilir . Burada mutlak (mutlak (x)) = x.

Kendisi ile bir kümenin birleşmesi her zaman aynı kümeyi döndürecek gibi ikili bir işlem olabilir .

şerefe


Bir idempotent işlem, f (f (x)) = f (x) 'dir. "üyelerini değiştirmeden bırakır" doğru bir cevap değildir.
Saeed Mohtasham

7

Her n. Sonucun, 1. sonucun değeriyle eşleşen bir çıktı ile sonuçlanacağı herhangi bir işlemdir. Örneğin -1 mutlak değeri 1'dir. Mutlak -1 değerinin mutlak değeri 1'dir. Mutlak değerin mutlak değeri -1'in mutlak değeri 1'dir.

Ayrıca bakınız: Özyineleme kullanmak için ne zaman aptalca bir zaman olurdu?


1
10 yıl sonra bile özlü bir cevaptır. +1
snr

3

İdempotent bir işlemi anlamanın iyi bir örneği, bir aracı uzaktan anahtarla kilitlemek olabilir.

log(Car.state) // unlocked

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

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

lockidempotent bir işlemdir. Her çalıştırdığınızda lock, yanıp sönme gibi bazı yan etkiler olsa bile , kilit işlemini kaç kez çalıştırırsanız sürün, araba hala aynı kilitli durumdadır.


1

5c'im: Entegrasyon ve ağ oluşturmada, idempotency çok önemlidir. Gerçek hayattan birkaç örnek: Hayal edin, hedef sisteme veri sağlıyoruz. Bir dizi mesajla iletilen veriler. 1. Dizi kanalda karıştırılırsa ne olur? (Ağ paketleri her zaman olduğu gibi :)). Hedef sistem idempotent ise, sonuç farklı olmayacaktır. Hedef sistem dizideki doğru sıraya bağlıysa, hedef siteye doğru sıralamayı geri yükleyecek resequencer uygulamamız gerekir. 2. Mesaj kopyaları olursa ne olur? Hedef sistemin kanalı zamanında onaylamazsa, kaynak sistem (veya kanalın kendisi) genellikle iletinin başka bir kopyasını gönderir. Sonuç olarak, hedef sistem tarafında yinelenen mesaj olabilir. Hedef sistem idempotent ise, onunla ilgilenir ve sonuç farklı olmaz. Hedef sistem idempotent değilse, kanalın hedef sistem tarafındaki tekilleştiriciyi uygulamalıyız.


Diğer isteklerden (veya sistemin durumunu değiştiren başka bir şeyden) ayrı ayrı gönderilen tekli isteklerin yetersizliği, yeniden sıralama istekleriyle aynı değildir. Bir HTTP PUT isteği ve bir HTTP DELETE isteğinin her ikisi de ayrı ayrı idempotent olmalıdır - ancak bu, aynı URL'de PUT ve DELETE çağrılma sırasının önemli olmadığı anlamına gelmez, çünkü PUT isteğinin yan etkileri olabilir!
Robin Green

1

Kısacası , Idempotent işlemleri, idempotent işlemleri kaç kez çalıştırırsanız yapın işlemin farklı sonuçlara yol açmayacağı anlamına gelir.

Örneğin, HTTP spesifikasyonunun tanımına göre GET, HEAD, PUT, and DELETE, idempotent işlemler; ancak POST and PATCHdeğildir. Bu yüzden bazen POSTyerini alır PUT.


-4

Yeniden deneme güvenli.

Genellikle bilgisayar bilimindeki anlamını anlamanın en kolay yoludur.


1
Yeniden Dene, ilk veya önceki seferde başarısız olan bir şeyi ima eder. Tam olarak aynı değil.
Lasse V. Karlsen

Sorumu kim düzenledi ve bana aşağı oy verdi? Gönderdiğim metin bu değil mi ??
teknopaul

Cevabınızın altındaki "X saat önce düzenlendi" veya benzeri bir bağlantıyı tıklayarak düzenleme günlüğünü kontrol edebilirsiniz.
Lasse V. Karlsen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.