Jawaban:
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 discard
metodenya. The discard
Metode 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.
set
contoh Python dalam jawaban, objek yang ditetapkan jelas memiliki status dan juga menawarkan beberapa operasi idempoten seperti discard
.
discard
juga 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.
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.
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 .
Tidak peduli berapa kali Anda memanggil operasi, hasilnya akan sama.
truncate
dan delete
.
Idempotensi berarti menerapkan operasi sekali atau menerapkannya berkali-kali memiliki efek yang sama.
Contoh:
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.
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.
f(x) = f(f(x))
. Tetapi seperti @GregHewgill sebutkan, agar definisi ini masuk akal, Anda harus mempertimbangkan x
sebagai objek dan f
sebagai operasi yang mengubah keadaan objek (yaitu: output dari f
adalah bermutasi x
).
Operasi idempoten menghasilkan hasil dalam keadaan yang sama bahkan jika Anda menyebutnya lebih dari sekali, asalkan Anda memberikan parameter yang sama.
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 User
kelas 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 User
konstruktor 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');
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.
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
Jawabannya cukup detail dan teknis. Hanya menambahkan definisi sederhana.
Idempotent = Re-runnable
Misalnya,
Create
operasi itu sendiri tidak dijamin berjalan tanpa kesalahan jika dijalankan lebih dari satu kali. Tetapi jika ada operasi CreateOrUpdate
maka menyatakan re-runnability (Idempotency).
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
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?
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
lock
adalah 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.
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.
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 DELETE
adalah operasi idempoten; namun POST and PATCH
tidak. Itu sebabnya terkadang POST
diganti dengan PUT
.
coba lagi aman.
Biasanya cara termudah untuk memahami maknanya dalam ilmu komputer.
Idempotent operations are often used in the design of network protocols
ini 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.