Apa operasi idempoten?

Jawaban:

964

Dalam komputasi, operasi idempoten adalah operasi yang tidak memiliki efek tambahan jika dipanggil lebih dari satu kali dengan parameter input yang sama. Misalnya, menghapus item dari suatu set dapat dianggap sebagai operasi idempoten pada set tersebut.

Dalam matematika, operasi idempoten adalah operasi di mana f (f (x)) = f (x) . Misalnya, abs()fungsinya idempoten karena abs(abs(x)) = abs(x)untuk semua x.

Definisi yang sedikit berbeda ini dapat direkonsiliasi dengan mempertimbangkan bahwa x dalam definisi matematis mewakili keadaan suatu objek, dan f adalah operasi yang dapat mengubah objek tersebut. Sebagai contoh, perhatikan Pythonset dan discardmetodenya. The discardMetode menghilangkan elemen dari satu set, dan tidak apa-apa jika elemen tidak ada. Begitu:

my_set.discard(x)

memiliki efek yang persis sama dengan melakukan operasi yang sama dua kali:

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

Operasi idempoten sering digunakan dalam desain protokol jaringan, di mana permintaan untuk melakukan operasi dijamin terjadi setidaknya sekali, tetapi mungkin juga terjadi lebih dari sekali. Jika operasi idempoten, maka tidak ada salahnya melakukan operasi dua kali atau lebih.

Lihat artikel Wikipedia tentang idempotensi untuk informasi lebih lanjut.


Jawaban di atas sebelumnya memiliki beberapa contoh yang salah dan menyesatkan. Komentar di bawah ini ditulis sebelum April 2014 merujuk pada revisi yang lebih lama.

Greg Hewgill
sumber
6
Contoh: karena jawaban di atas menyatakan bahwa Idempotent operations are often used in the design of network protocolsini adalah contoh terkait ** GET tidak seharusnya mengubah apa pun di server, jadi GET adalah, idempotent. Dalam konteks HTTP / servlet, itu berarti permintaan yang sama dapat dibuat dua kali tanpa konsekuensi negatif. ** POST BUKAN idempoten.
KNU
1
Apakah "stateless" identik dengan "idempotent"?
Michael Osofsky
2
@MichaelOsofsky: Tidak, dalam setcontoh Python dalam jawaban, objek yang ditetapkan jelas memiliki status dan juga menawarkan beberapa operasi idempoten seperti discard.
Greg Hewgill
1
@MichaelOsofsky, discardjuga dapat diimplementasikan dengan cara bernegara dengan meliputi negara di nilai kembali: discard([my_set, x]) = [my_new_set, x]. Jadi kamu bisa melakukannya discard(discard([my_set, x])). Perhatikan bahwa [my_new_set, x]adalah hanya satu argumen dan jenisnya adalah 2-tupel.
Pacerier
2
@ Hijau Saat menggunakan istilah efek yang sama dalam konteks impotensi, itu berarti hasilnya sama, bukan aksinya . Memanggil discard(x)kedua kalinya akan memiliki efek yang sama dengan memanggilnya pertama kali: Perangkat tidak lagi berisi x. Komputasi idempotensi adalah tentang kekuatan suatu sistem. Karena hal-hal dapat gagal (mis. Pemadaman jaringan), ketika kegagalan terdeteksi, bagaimana Anda memulihkan? Pemulihan termudah adalah hanya melakukannya lagi, tetapi itu hanya berfungsi jika melakukannya lagi idempoten. Misalnya discard(x)idempoten, tetapi pop()tidak. Ini semua tentang pemulihan kesalahan.
Andreas
138

Operasi idempoten dapat diulang beberapa kali secara sewenang-wenang dan hasilnya akan sama seperti jika hanya dilakukan sekali. Dalam aritmatika, menambahkan nol ke angka adalah idempoten.

Idempoten banyak dibicarakan dalam konteks layanan web "RESTful". REST berupaya memanfaatkan HTTP secara maksimal untuk memberikan akses program ke konten web, dan biasanya berbeda dengan layanan web berbasis SOAP, yang hanya menyalurkan layanan gaya panggilan prosedur jarak jauh di dalam permintaan dan respons HTTP.

REST mengatur aplikasi web menjadi "sumber daya" (seperti pengguna Twitter, atau gambar Flickr) dan kemudian menggunakan kata kerja HTTP dari POST, PUT, DAPATKAN, dan HAPUS untuk membuat, memperbarui, membaca, dan menghapus sumber daya tersebut.

Idempotensi memainkan peran penting dalam REST. Jika Anda DAPATKAN representasi dari sumber daya REST (misalnya, DAPATKAN gambar jpeg dari Flickr), dan operasi gagal, Anda bisa mengulang GET lagi dan lagi sampai operasi berhasil. Untuk layanan web, tidak masalah berapa kali gambar didapat. Demikian juga, jika Anda menggunakan layanan web RESTful untuk memperbarui informasi akun Twitter Anda, Anda dapat PUT informasi baru sebanyak yang diperlukan untuk mendapatkan konfirmasi dari layanan web. PUT-ing itu seribu kali sama dengan PUT-ing sekali. Demikian pula HAPUS sumber daya REST seribu kali sama dengan menghapusnya sekali. Idempotence sehingga membuatnya jauh lebih mudah untuk membangun layanan web yang tahan terhadap kesalahan komunikasi.

Bacaan lebih lanjut: Layanan Web RESTful , oleh Richardson dan Ruby (idempoten dibahas pada halaman 103-104), dan disertasi PhD Roy Fielding tentang REST . Fielding adalah salah satu penulis HTTP 1.1, RFC-2616, yang berbicara tentang idempotensi di bagian 9.1.2 .

Jim Ferrans
sumber
Jelas dan lugas. Namun ini hanyalah satu interpretasi idempoten.
Pacerier
10
"idempotence" adalah kata yang sangat kelebihan karena kedengarannya agung dan memiliki karakter yang cukup untuk lulus cek sesquipedalian. Jika Benjamin Peirce telah memilih kata yang terdengar lebih sederhana, kita bahkan tidak akan memiliki pertanyaan ini hari ini.
Pacerier
2
Bagaimana memahaminya: Sama HAPUS menghapus sumber daya REST seribu kali sama dengan menghapusnya sekali ? Anda tidak dapat menghapus sumber daya lagi jika sudah dihapus.
Hijau
1
@ Hijau tetapi Anda tidak menghapusnya pertama kali. Anda mengirim permintaan penghapusan . Poin pentingnya adalah Anda dapat mengirim sebanyak mungkin permintaan.
Caleth
1
@JimFerrans, saya mengerti. Saya pikir mungkin ada beberapa alasan yang berhubungan dengan fungsionalitas (dibangun ke dalam HTTP itu sendiri) tentang mengapa PUT dapat dikirim ulang tanpa kekhawatiran sementara POST tidak bisa. Sekarang tampaknya kita hanya diharuskan untuk memenuhi standar HTTP dan perilaku tersebut sepenuhnya didasarkan pada bagaimana server diimplementasikan
mangusta
109

Tidak peduli berapa kali Anda memanggil operasi, hasilnya akan sama.

Robert
sumber
8
Saya pernah mendengar idempoten didefinisikan sebagai salah satu atau keduanya di bawah ini: 1) Untuk serangkaian input yang diberikan, ia akan selalu menghasilkan output yang sama. 2) Tidak menghasilkan efek samping. Pertanyaan saya adalah, jika suatu fungsi sesuai dengan # 1, tetapi bukan # 2, karena menghasilkan efek samping yang tidak terkait dengan perhitungan (misalnya, mencatat permintaan ke penyimpanan data), apakah masih dianggap idempoten?
Keith Bennett
12
Hasil dari pemanggilan suatu operasi harus mencakup keadaan sistem, jadi jika operasi memiliki beberapa efek samping kumulatif, ia tidak idempoten; Namun, jika efek samping meninggalkan sistem dalam keadaan yang sama tidak peduli berapa kali operasi dipanggil, maka mungkin idempoten.
Robert
4
Pendek dan manis, saya suka jawaban semacam itu. Tidak yakin mengapa saya harus mencari istilah ini terus-menerus, itu salah satu yang tidak tinggal bersama saya.
Prancer
1
@ KeithBennett, Definisi kedua salah. "Tidak ada efek samping" tidak berarti idempoten. Fungsi idempoten dapat memiliki efek samping. Misalnya MySQL truncatedan delete.
Pacerier
Hasilnya akan sama (yaitu, status sistem), tetapi responsnya mungkin berbeda-beda (yaitu, kode status HTTP pada layanan REST).
G. Steigert
50

Idempotensi berarti menerapkan operasi sekali atau menerapkannya berkali-kali memiliki efek yang sama.

Contoh:

  • Perkalian dengan nol. Tidak peduli berapa kali Anda melakukannya, hasilnya masih nol.
  • Mengatur bendera boolean. Tidak peduli berapa kali Anda melakukannya, bendera tetap ditetapkan.
  • Menghapus baris dari database dengan ID yang diberikan. Jika Anda mencobanya lagi, baris masih hilang.

Untuk fungsi murni (fungsi tanpa efek samping) maka idempotensi mengimplikasikan bahwa f (x) = f (f (x)) = f (f (f (x))) = f (f (f (f (f (x)))) ) = ...... untuk semua nilai x

Untuk fungsi dengan efek samping , idempotensi juga menyiratkan bahwa tidak ada efek samping tambahan yang akan terjadi setelah aplikasi pertama. Anda bisa menganggap keadaan dunia sebagai parameter "tersembunyi" tambahan untuk fungsi jika Anda mau.

Perhatikan bahwa di dunia di mana Anda melakukan tindakan bersamaan, Anda mungkin menemukan bahwa operasi yang Anda pikir idempoten dihentikan begitu saja (misalnya, utas lainnya dapat mengeset nilai bendera boolean pada contoh di atas). Pada dasarnya setiap kali Anda memiliki konkurensi dan keadaan bisa berubah, Anda perlu berpikir lebih hati-hati tentang idempotensi.

Idempotensi seringkali merupakan properti yang berguna dalam membangun sistem yang kuat. Misalnya, jika ada risiko Anda menerima pesan duplikat dari pihak ketiga, akan sangat membantu jika penangan pesan bertindak sebagai operasi idempoten sehingga efek pesan hanya terjadi sekali.

mikera
sumber
1
Jika untuk fungsi murni f(x) = f(f(x)), Apakah maksud Anda itu f(x){return x+1;}bukan fungsi murni? karena f(x) != f(f(x)): f(1)memberi 2 sambil f(2)memberi 3.
Pacerier
1
@Pacerier Tidak, @mikera mengatakan bahwa ini murni dan idempoten f(x) = f(f(x)). Tetapi seperti @GregHewgill sebutkan, agar definisi ini masuk akal, Anda harus mempertimbangkan xsebagai objek dan fsebagai operasi yang mengubah keadaan objek (yaitu: output dari fadalah bermutasi x).
Justin J Stark
24

Operasi idempoten menghasilkan hasil dalam keadaan yang sama bahkan jika Anda menyebutnya lebih dari sekali, asalkan Anda memberikan parameter yang sama.

Caleb Huitt - cjhuitt
sumber
1
Tidak terdengar logis sama sekali. stackoverflow.com/questions/1077412/…
Hijau
2
Saya pikir Anda mungkin membingungkan idempoten dan deterministik .
Suncat2000
16

Hanya ingin membuang case use nyata yang menunjukkan idempotence. Dalam JavaScript, misalkan Anda mendefinisikan sekelompok kelas model (seperti pada model MVC). Cara ini sering diterapkan secara fungsional setara dengan sesuatu seperti ini (contoh dasar):

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

  return Model;
}

Anda kemudian dapat mendefinisikan kelas baru seperti ini:

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

Tetapi jika Anda mencoba untuk mendapatkan Userkelas melalui model('user'), dari tempat lain dalam kode, itu akan gagal:

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

Kedua Userkonstruktor itu akan berbeda. Itu adalah,

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

Untuk membuatnya idempoten , Anda hanya perlu menambahkan semacam mekanisme caching, seperti ini:

var collection = {};

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

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

  collection[name] = Model;
  return Model;
}

Dengan menambahkan caching, setiap kali Anda melakukannya model('user')akan menjadi objek yang sama, dan itu idempoten. Begitu:

model('user') === model('user');
Lance Pollard
sumber
10

Operasi idempoten adalah operasi, tindakan, atau permintaan yang dapat diterapkan beberapa kali tanpa mengubah hasilnya, yaitu keadaan sistem, di luar aplikasi awal.

CONTOH (CONTEXT APLIKASI WEB):

IDEMPOTENT: Membuat beberapa permintaan identik memiliki efek yang sama dengan membuat satu permintaan. Pesan dalam sistem pesan email dibuka dan ditandai sebagai "dibuka" dalam database. Seseorang dapat membuka pesan berkali-kali tetapi tindakan berulang ini hanya akan menghasilkan pesan tersebut berada dalam keadaan "dibuka". Ini adalah operasi idempoten. Pertama kali seseorang PUT pembaruan ke sumber daya menggunakan informasi yang tidak cocok dengan sumber daya (keadaan sistem), keadaan sistem akan berubah ketika sumber daya diperbarui. Jika satu PUT melakukan pembaruan yang sama ke suatu sumber daya berulang kali maka informasi dalam pembaruan tersebut akan cocok dengan informasi yang sudah ada dalam sistem pada setiap PUT, dan tidak ada perubahan pada kondisi sistem yang akan terjadi. PUT berulang dengan informasi yang sama idempoten:

NON-IDEMPOTENT: Jika suatu operasi selalu menyebabkan perubahan status, seperti POSTing pesan yang sama kepada pengguna berulang-ulang, menghasilkan pesan baru yang dikirim dan disimpan dalam database setiap waktu, kami mengatakan bahwa operasinya adalah NON-IDEMPOTENT.

NULLIPOTENT: Jika suatu operasi tidak memiliki efek samping, seperti murni menampilkan informasi pada halaman web tanpa perubahan dalam basis data (dengan kata lain Anda hanya membaca basis data), kami mengatakan operasi tersebut adalah NULLIPOTENT. Semua GET harus nullipotent.

Ketika berbicara tentang keadaan sistem, kita jelas mengabaikan efek mudah-mudahan tidak berbahaya dan tak terhindarkan seperti pencatatan dan diagnostik.

nmit026
sumber
9

Operasi Idempoten: Operasi yang tidak memiliki efek samping jika dijalankan beberapa kali.
Contoh : Suatu operasi yang mengambil nilai dari sumber daya data dan mengatakan, mencetaknya

Operasi Non-Idempoten: Operasi yang akan menyebabkan beberapa bahaya jika dijalankan beberapa kali. (Ketika mereka mengubah beberapa nilai atau status)
Contoh: Suatu operasi yang menarik dari rekening bank

Mahmoud Abou-Eita
sumber
3
Sebenarnya jawaban yang salah! untuk operasi Idempoten mengatakan "tidak memiliki efek samping" tidak benar. untuk operasi non-idempoten yang mengatakan "menyebabkan kerusakan" adalah jawaban yang membingungkan.
Saeed Mohtasham
9

Jawabannya cukup detail dan teknis. Hanya menambahkan definisi sederhana.

Idempotent = Re-runnable

Misalnya, Createoperasi itu sendiri tidak dijamin berjalan tanpa kesalahan jika dijalankan lebih dari satu kali. Tetapi jika ada operasi CreateOrUpdatemaka menyatakan re-runnability (Idempotency).

Manish Basantani
sumber
3
Ini adalah definisi yang menipu. re-runnability tidak menjamin idempoten. Suatu operasi dapat dijalankan kembali dan dalam setiap menjalankannya dapat menambahkan efek tambahan pada hasilnya sehingga tidak akan idempoten.
Saeed Mohtasham
7

Operasi idempoten pada set membuat anggotanya tidak berubah ketika diterapkan satu kali atau lebih.

Ini bisa menjadi operasi unary seperti absolut (x) di mana x milik satu set bilangan bulat positif. Di sini absolut (absolut (x)) = x.

Ini bisa berupa operasi biner seperti penyatuan satu set dengan dirinya sendiri akan selalu mengembalikan set yang sama.

Bersulang

Arnkrishn
sumber
Operasi idempoten adalah operasi di mana f (f (x)) = f (x). "meninggalkan anggotanya tidak berubah" bukanlah jawaban yang benar.
Saeed Mohtasham
7

Ini adalah operasi yang setiap hasil ke-n akan menghasilkan output yang cocok dengan nilai hasil pertama. Misalnya nilai absolut dari -1 adalah 1. Nilai absolut dari nilai absolut -1 adalah 1. Nilai absolut dari nilai absolut dari nilai absolut -1 adalah 1. Dan seterusnya.

Lihat juga: Kapan waktu yang sangat konyol untuk menggunakan rekursi?

Oorang
sumber
1
itu adalah jawaban bernas bahkan setelah 10 tahun. +1
snr
3

Contoh yang baik untuk memahami operasi idempoten mungkin mengunci mobil dengan kunci jarak jauh.

log(Car.state) // unlocked

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

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

lockadalah operasi idempoten. Sekalipun ada beberapa efek samping setiap kali Anda berlari lock, seperti berkedip, mobil masih dalam kondisi terkunci yang sama, tidak peduli berapa kali Anda menjalankan operasi kunci.

ivn
sumber
1

5c saya: Dalam integrasi dan jaringan idempotensi sangat penting. Beberapa contoh dari kehidupan nyata: Bayangkan, kami mengirimkan data ke sistem target. Data dikirimkan dengan urutan pesan. 1. Apa yang akan terjadi jika urutannya dicampur dalam saluran? (Seperti paket jaringan selalu lakukan :)). Jika sistem target idempoten, hasilnya tidak akan berbeda. Jika sistem target bergantung pada urutan yang benar dalam urutan, kita harus menerapkan penyeimbang di situs target, yang akan mengembalikan urutan yang benar. 2. Apa yang akan terjadi jika ada duplikat pesan? Jika saluran sistem target tidak mengakui tepat waktu, sistem sumber (atau saluran itu sendiri) biasanya mengirimkan salinan pesan yang lain. Sebagai hasilnya, kita dapat memiliki pesan duplikat di sisi sistem target. Jika sistem target idempoten, itu merawatnya dan hasilnya tidak akan berbeda. Jika sistem target tidak idempoten, kita harus mengimplementasikan deduplicator di sisi sistem target saluran.

Leonid Ganeline
sumber
Idempotensi permintaan tunggal yang dikirim secara terpisah dari permintaan lain (atau apa pun yang terjadi yang mengubah keadaan sistem), tidak sama dengan permintaan pemesanan ulang. Permintaan HTTP PUT dan permintaan HTTP DELETE keduanya harus idempoten secara individu - tetapi itu tidak berarti bahwa urutan panggilan PUT dan HAPUS pada URL yang sama tidak masalah, karena permintaan PUT mungkin memiliki efek samping!
Robin Green
1

Singkatnya , operasi Idempoten berarti operasi tidak akan menghasilkan hasil yang berbeda, tidak peduli berapa kali Anda mengoperasikan operasi idempoten.

Misalnya, menurut definisi spesifikasi HTTP, GET, HEAD, PUT, and DELETEadalah operasi idempoten; namun POST and PATCHtidak. Itu sebabnya terkadang POSTdiganti dengan PUT.

Marcus Thornton
sumber
-4

coba lagi aman.

Biasanya cara termudah untuk memahami maknanya dalam ilmu komputer.

teknopaul
sumber
1
Coba lagi menyiratkan sesuatu yang gagal pada waktu pertama atau sebelumnya. Tidak persis sama.
Lasse V. Karlsen
Siapa yang mengedit pertanyaan saya dan memberi saya suara rendah? Itu bukan teks yang saya posting ??
teknopaul
Anda dapat memeriksa log edit dengan mengklik tautan di bawah jawaban Anda yang mengatakan "diedit X jam yang lalu" atau serupa.
Lasse V. Karlsen