Stateless vs Stateful: Mengapa Strategi Deployment Anda Bergantung Padanya
Anda memiliki dua instance dari aplikasi yang sama berjalan. Seorang pengguna membuat permintaan. Instance mana yang menanganinya? Jika jawabannya "salah satu saja, tidak masalah," Anda sedang melihat aplikasi stateless. Jika jawabannya "harus instance yang sama yang menangani permintaan sebelumnya," Anda berurusan dengan aplikasi stateful.
Perbedaan ini bukan sekadar akademis. Ini menentukan seberapa mudah Anda dapat men-deploy versi baru, melakukan scale-up saat lonjakan traffic, atau roll back saat terjadi kesalahan. Banyak tim menemukan ini dengan cara yang sulit: mereka membangun pipeline deployment yang bekerja sempurna untuk satu layanan, lalu mencoba menerapkan pendekatan yang sama ke layanan lain dan mengalami kegagalan yang tidak terduga.
Apa yang Membuat Aplikasi Menjadi Stateless
Aplikasi stateless tidak mengingat apa pun di antara permintaan. Setiap permintaan bersifat independen. Aplikasi menerima input, memprosesnya, mengembalikan hasil, dan melupakan semua tentang interaksi tersebut.
Bayangkan sebuah endpoint API yang menerima ID produk dan mengembalikan detail produk dari database. Setiap panggilan bersifat mandiri. Aplikasi tidak peduli siapa yang memanggilnya, apa yang mereka panggil sebelumnya, atau apa yang terjadi setelahnya. Jika Anda menjalankan tiga instance API ini di belakang load balancer, instance mana pun dapat menangani permintaan apa pun. Mereka dapat dipertukarkan.
Contoh umum aplikasi stateless meliputi:
Flowchart berikut membandingkan jalur deployment untuk aplikasi stateless dan stateful.
- REST API yang membaca dan menulis ke database bersama
- Layanan pemrosesan gambar yang mentransformasi file dan mengembalikan hasil
- Layanan autentikasi yang memvalidasi token tanpa menyimpan data sesi
- Halaman web yang di-render server yang menyimpan semua state di cookie atau parameter URL
Aplikasi stateless adalah yang paling mudah untuk di-deploy, di-scale, dan dipulihkan. Anda dapat menjalankan beberapa versi secara berdampingan, mengalihkan traffic secara bertahap, dan beralih kembali secara instan jika terjadi kesalahan.
Apa yang Membuat Aplikasi Menjadi Stateful
Aplikasi stateful perlu mengingat sesuatu di antara permintaan. Sesuatu itu disebut state. Bisa berupa keranjang belanja, sesi chat aktif, upload file yang sedang berlangsung, atau sesi autentikasi pengguna yang disimpan di memori server.
Pertimbangkan aplikasi e-commerce. Seorang pengguna menambahkan item ke keranjang mereka. Data keranjang berada di server yang menangani permintaan itu. Jika permintaan berikutnya pergi ke server yang berbeda, server itu tidak tahu tentang keranjang tersebut. Pengguna melihat keranjang kosong. Ini adalah masalah stateful.
Aplikasi stateful menyimpan state di beberapa tempat:
- Di memori pada server aplikasi (data sesi)
- File lokal di server (file yang diupload, data sementara)
- Database embedded yang berjalan bersama aplikasi
- Cache tingkat aplikasi yang tidak dibagikan antar instance
Tantangannya bukanlah bahwa state itu ada. Tantangannya adalah di mana state itu berada. Jika state terikat pada instance tertentu, Anda tidak dapat dengan bebas merutekan traffic, mengganti instance, atau melakukan scale-down tanpa kehilangan data.
Bagaimana Aplikasi Stateless Menyederhanakan Deployment
Men-deploy aplikasi stateless sangatlah mudah. Anda memulai instance baru dengan versi baru di samping instance lama. Load balancer secara bertahap mengarahkan traffic ke instance baru. Setelah semua traffic berada di versi baru, Anda mematikan instance lama.
Jika versi baru memiliki bug, Anda membalikkan prosesnya. Arahkan traffic kembali ke instance lama. Tidak ada migrasi data, tidak ada perubahan skema, tidak ada pemulihan sesi. Rollback hanyalah pengalihan traffic ulang.
Scaling mengikuti logika yang sama. Butuh kapasitas lebih? Mulai instance lagi. Traffic turun? Hapus instance. Tidak ada data yang perlu didistribusikan ulang. Setiap instance identik dan dapat dibuang.
Kesederhanaan inilah mengapa arsitektur microservices lebih menyukai desain stateless. Setiap layanan dapat di-deploy secara independen tanpa khawatir tentang apa yang diingat instance lain.
Mengapa Aplikasi Stateful Memerlukan Perhatian Lebih
Men-deploy aplikasi stateful berarti berurusan dengan data yang tidak boleh hilang atau rusak. Jika aplikasi menyimpan sesi di memori, mengganti semua instance sekaligus akan mengeluarkan semua pengguna aktif. Jika aplikasi menulis ke file lokal, file-file tersebut harus dimigrasi atau versi baru harus kompatibel dengan format data lama.
Strategi umum untuk men-deploy aplikasi stateful meliputi:
Pindahkan state ke luar aplikasi. Simpan sesi di cluster Redis bersama atau database. Simpan file yang diupload di object storage seperti S3. Ini mengubah aplikasi menjadi stateless dari perspektif deployment. Aplikasi dapat diganti dengan bebas karena state berada di tempat lain.
Gunakan sticky sessions. Konfigurasikan load balancer untuk mengirim pengguna yang sama ke instance yang sama. Ini berfungsi tetapi menimbulkan masalah selama deployment. Anda tidak dapat mengosongkan traffic dari instance tanpa mengganggu pengguna aktif. Rolling update menjadi lebih lambat karena Anda harus menunggu sesi kedaluwarsa.
Gunakan stateful sets atau operators. Kubernetes StatefulSets dan operator database menangani kompleksitas deployment aplikasi stateful. Mereka memastikan instance dimulai dan dihentikan secara berurutan, data dipertahankan, dan identitas jaringan stabil. Tetapi mereka memerlukan pemahaman tentang bagaimana aplikasi stateful spesifik Anda berperilaku.
Rencanakan migrasi data. Jika versi baru mengubah cara data disimpan, deployment harus menyertakan langkah migrasi. Rollback menjadi berisiko karena versi lama mungkin tidak memahami format data baru. Ini umum terjadi dengan perubahan skema database.
Dampak Nyata pada Tim Anda
Perbedaan stateless versus stateful memengaruhi lebih dari sekadar keputusan teknis. Ini membentuk cara tim Anda beroperasi.
Aplikasi stateless memungkinkan deployment yang cepat dan sering. Anggota tim mana pun dapat men-deploy versi baru tanpa khawatir kehilangan data. Rollback aman dan cepat. Ini mengurangi ketakutan akan deployment dan mendorong rilis yang lebih kecil dan lebih sering.
Aplikasi stateful memerlukan koordinasi yang cermat. Deployment perlu direncanakan seputar migrasi data, penanganan sesi, dan kompatibilitas rollback. Tim sering mengembangkan prosedur khusus untuk layanan stateful: jendela deployment, gerbang persetujuan, langkah verifikasi manual. Ini memperlambat pengiriman.
Jika organisasi Anda memiliki kedua jenis aplikasi, jangan berharap satu proses deployment dapat bekerja untuk semuanya. Pipeline untuk API stateless tidak akan cocok untuk migrasi database atau layanan stateful yang mengelola sesi pengguna.
Daftar Periksa Singkat untuk Deployment Anda Berikutnya
Sebelum Anda merencanakan deployment, ajukan pertanyaan-pertanyaan ini:
- Apakah aplikasi menyimpan data apa pun secara lokal yang harus bertahan saat restart?
- Apakah sesi pengguna disimpan di memori atau di penyimpanan eksternal bersama?
- Dapatkah instance mana pun menangani permintaan apa pun, atau apakah routing bergantung pada instance mana yang memiliki data?
- Jika Anda roll back ke versi sebelumnya, apakah format data masih dapat dibaca?
- Dapatkah Anda menjalankan dua versi secara berdampingan tanpa konflik data?
Jika Anda menjawab "tidak" untuk semua pertanyaan tentang penyimpanan lokal dan ketergantungan sesi, Anda memiliki aplikasi stateless. Deploy dengan bebas. Jika Anda menjawab "ya" untuk salah satunya, Anda perlu merencanakan manajemen state sebelum mendesain strategi deployment Anda.
Kesimpulan
Aplikasi stateless memberi Anda kebebasan. Aplikasi stateful memberi Anda batasan. Kesalahannya adalah memperlakukan keduanya dengan cara yang sama. Sebelum Anda mendesain pipeline deployment, pahami di mana data Anda berada. Jika data berada di dalam instance aplikasi, strategi deployment Anda harus memperhitungkan data tersebut. Jika data berada di luar, Anda dapat memperlakukan aplikasi sebagai sesuatu yang dapat dibuang dan melakukan deployment dengan percaya diri.