Saat ini dengan semakin berkembang pesatnya pertumbuhan startup dan beberpa startup bahkan berhasil mengembangkan dirinya menjadi superapp. Ini tentu membawa pengaruh yang signifikan pada desain system startup tersebut.
Sistem yang dibangun tidak lagi hanya sekedar microservice tapi juga telah berubah menjadi sistem terdistribusi. Pada sistem terdistribusi kompleksitas design sistem cukup kompleks, di sini Anda akan menemukan hal-hal baru yang bisa dipelajari.
Salah satu hal yang menarik pada sistem terdistribusi adalah idempotent, idempotent bisa diartikan secara sederhana sebagai sebuah aktivitas yang menghasilkan hal yang sama secara berulang-ulang.
Untuk memahami ilustrasi dari idempotent katakanlah Anda mempunya saldo 1000 rupiah pada account ewallet Anda, kemudian Anda ingin mengambil uang 100 rupiah dari account tersebut.
Untuk memahami proses idempotent sebaiknya kita pahami dulu proses non-idempotent Anda lebih mudah memahaminya.
trx non idempotent
Dari gambar ilustrasi diatas dapat kita catat beberapa point :
1) Client meminta server untuk memproses debit 100 rupiah dari accountnya, dalam hal ini client membuat permintaan keserver untuk memproses pendebetan saldo.
2) Server memproses permintaan client dengan mendebet saldo 1000 -100, dengan saldo tersisa 900 rupiah.
3) Setelah proses pendebetan saldo sukses, server mengirimkan response ke client, status sukses dan sisa saldo 900.
Sekarang mari kita berandai-andai jika pesan response sukses hilang dari koneksi, atau request client ter-cancel karena server mengalami timeout. Client tidak mendapatkan response sukses padahal saldo pada sisi server telah terdebet.
Kemudian client merequest ulang dengan post data yang sama, jika Anda tetap mempertahankan design Non-Idempotent tentu server akan memproses request ke-2 ini sebagai sebuah perintah baru yang tentunya akan saldo akan berkurang lagi menjadi 100 ruupiah.
Pada kondisi ini informasi saldo yang diterima oleh client adalah 800 rupiah, tentu cleint akan bingung karena client masih beranggapan sisa saldo adalah 900 rupiah.
Untuk menangani problem diatas Anda perlu mendesain sistem dengan konsep idempotent.
trx idempotent
Dari ilustrasi sederhana diatas dapat kita catat beberapa hal :
1) Setiap proses pendebetan saldo sukses akan di simpan lognya ke dalam redis
2) Ketika terjadi request timeout dari client ke server, client memungkinkan untuk merequest ulang ke server dengan request yang sama, dan server akan mencari log data berdasarkan requestID, jika requestID tersebut ada maka server akan mngirimkan respon ke client di ambil dari log data
3) Ketika requestID tidak ditemukan maka transaksi akan dianggap sebagai sebuah transaksi baru dan saldo akan di debet.
Dari dua ilustrasi diatas, tentunya idempotent menjadi salah satu solusi yang bisa di terapkan pada desain sistem terdistribusi.