Apa itu idempotensi?

Dalam ilmu komputer, idempotensi adalah properti operasi yang jika diterapkan beberapa kali akan menghasilkan efek akhir yang sama seperti jika diterapkan sekali saja. Jika Anda mengirimkan permintaan yang sama ke server lima kali, sistem idempoten memastikan bahwa hasil di server tidak berubah setelah upaya pertama berhasil.

Selain memastikan hasil yang sama, karakteristik utama operasi idempoten adalah tidak menghasilkan efek samping dengan panggilan tambahan. Hal ini merupakan persyaratan inti untuk membangun sistem terdistribusi yang tangguh, di mana pemadaman jaringan atau waktu tunggu yang terputus-putus dapat menyebabkan klien mengirim pesan yang sama lebih dari satu kali.

Analogi: Bayangkan tombol "naik" di lift. Jika menekannya sekali, elevator akan dipanggil ke lantai Anda. Jika Anda menekan tombol itu sepuluh kali lagi sambil menunggu, hasilnya tetap sama—satu lift tetap akan datang ke lantai Anda. Menekan tombol beberapa kali tidak akan memanggil sepuluh lift terpisah. Sebaliknya, menambahkan item ke keranjang belanja digital biasanya tidak idempoten. Jika Anda mengklik tombol "Tambahkan ke Keranjang" lima kali, kemungkinan Anda akan mendapatkan lima item tersebut di keranjang.

Manfaat utama sistem idempoten

Coba lagi permintaan dengan aman setelah waktu habis atau koneksi terputus tanpa takut menduplikasi tindakan (seperti menagih kartu kredit dua kali).

Pengguna tidak memerlukan pelacakan status yang kompleks untuk mengetahui apakah permintaan sebelumnya berhasil atau tidak; mereka cukup "mencoba lagi hingga berhasil".

Sistem terdistribusi dapat pulih dari error dengan memutar ulang log atau mengirim ulang pesan yang terlewat tanpa merusak data.

Metode HTTP idempoten versus non-idempoten

Standar REST menentukan cara berbagai jenis permintaan web harus berperilaku. Beberapa metode HTTP secara alami "aman" atau idempoten berdasarkan desainnya, yang berarti spesifikasi mengharapkan metode tersebut berperilaku secara terprediksi meskipun diulang. Yang lain dirancang untuk membuat data baru dan memerlukan perhatian ekstra agar aman untuk dicoba lagi.

Metode idempoten (GET, PUT, DELETE)

Menurut RFC 9110, beberapa metode standar secara inheren bersifat idempoten. Pengulangan tindakan ini tidak boleh mengubah status server di luar permintaan awal.

  • GET: Metode ini mengambil data. Karena tidak mengubah apa pun di server, Anda dapat memanggilnya jutaan kali dan resource tetap sama.
  • PUT: Metode ini mengganti seluruh resource. Jika Anda memperbarui email pengguna menjadi "user@example.com" tiga kali, alamat email tersebut pada akhirnya tetap "user@example.com".
  • DELETE: Menghapus resource. Jika Anda menghapus "Pesanan #123" lalu mencoba menghapusnya lagi, pesanan tersebut tetap terhapus. Hasilnya (pesanan terhapus) tetap sama.

Metode non-idempoten (POST, PATCH)

Beberapa metode tidak bersifat idempoten karena tugas utamanya adalah mengubah data dengan cara membuat sesuatu yang baru atau memodifikasi sebagian dari kumpulan data yang ada.

  • POST: Developer menggunakan POST untuk membuat resource baru. Tanpa logika idempotensi, mengirimkan permintaan POST yang sama dua kali (seperti "Kirim Pembayaran") biasanya akan menghasilkan dua kumpulan data terpisah—dan dua tagihan kepada pelanggan.
  • PATCH: Metode ini menerapkan update parsial. Meskipun dapat dibuat idempoten, fungsi ini sering kali tidak idempoten secara default karena mengulang perubahan relatif (seperti "tambahkan 5 ke saldo") akan menghasilkan nilai akhir yang berbeda setiap kali dipanggil.

Cara menerapkan API idempoten

  1. Membuat kunci unik: Klien membuat string unik (seperti UUID) dan menyertakannya dalam header HTTP kustom.
  2. Mencegat dan memvalidasi: Server memeriksa penyimpanan data berkecepatan tinggi seperti Memorystore untuk melihat apakah kunci tersebut telah diproses baru-baru ini.
  3. Menangani status: Jika kuncinya baru, proses permintaan dan simpan hasilnya. Jika duplikat, segera kembalikan hasil yang disimpan tanpa menjalankan kembali logika bisnis.

Kasus penggunaan umum untuk idempotensi

Idempotensi sering kali diperlukan dalam sistem yang kita bangun. Dalam beberapa kasus, hal ini ditangani untuk kita. Dalam kasus lain, kita sebagai developer perlu mengambil tindakan untuk mewujudkannya.

Contoh paling terkenal adalah masalah "tagihan ganda". Jika browser pengguna hang saat mereka membayar penerbangan, mereka mungkin akan mengklik "Bayar" lagi. API pembayaran yang menggunakan kunci idempotensi memastikan bahwa klik kedua dikenali sebagai percobaan ulang. Hal ini melindungi rekening bank pelanggan dan mengurangi biaya operasional penanganan pengembalian dana untuk transaksi duplikat.

  • Tindakan developer diperlukan: Anda harus menerapkan kunci idempotensi (sering kali UUID) dalam permintaan API Anda untuk memastikan klik kedua dikenali sebagai percobaan ulang, sehingga melindungi rekening bank pelanggan

Alat seperti Terraform dan Ansible mengandalkan idempotensi. Saat Anda menjalankan skrip untuk "membuat bucket penyimpanan 10 GB", alat ini akan memeriksa status cloud Anda saat ini.

  • Ditangani untuk Anda: Idempotensi dikelola oleh alat IaC itu sendiri; sebagai developer, Anda tidak perlu menulis logika tambahan untuk mencegah duplikasi resource

API web modern sering kali mengimplementasikan header Kunci Indempotensi (kini merupakan draf IETF yang terstandardisasi) untuk memungkinkan developer membangun integrasi yang lebih tangguh.

  • Tindakan developer diperlukan: Saat membangun backend, Anda harus mengimplementasikan logika untuk mencegat kunci ini, memeriksa upaya sebelumnya, dan mengembalikan respons yang di-cache

"Upsert" (update atau insert) adalah operasi database klasik yang bersifat idempoten. Alih-alih "Insert" yang sederhana, upsert berarti: "Jika kumpulan data ini ada, lakukan update; jika tidak, buatlah."

  • Ditangani untuk Anda: Logika ini ditangani secara native oleh mesin database, sehingga memastikan kumpulan data akan konvergen ke status yang benar, berapa pun jumlah skrip dijalankan

Mengatasi tantangan bisnis Anda dengan Google Cloud

Pelanggan baru mendapatkan kredit gratis senilai $300 untuk dibelanjakan di Google Cloud.
Hubungi spesialis penjualan Google Cloud untuk membahas tantangan unik Anda secara lebih mendetail.

Membangun microservice yang andal di Google Cloud

Google Cloud menyediakan beberapa alat yang memudahkan developer mengimplementasikan pola ini. Membangun platform terkelola mengurangi jumlah kode "boilerplate" yang perlu Anda tulis untuk menjaga keamanan data Anda.

  • Cloud Run: Saat Anda menggunakan Cloud Run untuk memproses peristiwa dari Pub/Sub, ingatlah bahwa Pub/Sub dapat mengirimkan pesan lebih dari satu kali secara default. Menulis kode idempoten di layanan Cloud Run Anda adalah persyaratan untuk memastikan agen AI atau pipeline data Anda tidak memproses peristiwa yang sama dua kali.
  • Catatan tentang Pub/Sub: Meskipun defaultnya adalah pengiriman berbasis Push, pengiriman tepat satu kali tersedia untuk langganan berbasis Pull. Penting untuk mengetahui kedua jenis ini agar Anda dapat memilih tingkat kompleksitas yang tepat untuk layanan Anda.

Siap untuk membangun?

Pelajari cara men-deploy layanan yang tangguh dan idempoten di Cloud Run sekarang.