Saya telah belajar tentang aplikasi stateful vs non-stateful, tapi saya masih sedikit bingung dengan topik ini.
Sebagai contoh, katakanlah saya memiliki aplikasi yang berjalan di Node di mana pengguna ditugaskan ke kamar acak segera setelah mereka terhubung melalui socket.io. Ini adalah kamar 4 dan tidak persisten dengan cara apa pun, tetapi mereka disimpan dalam variabel global sebagai peta hash. Saya tidak menggunakan db (terlalu banyak permintaan) atau redis (terlalu mahal).
Apakah ini contoh aplikasi stateful atau tidak?
terminology
node.js
state
kejujuran
sumber
sumber
Jawaban:
Dalam konteks aplikasi web, kami memanggil server stateful jika server mempertahankan keadaan sementara dalam memori , daripada menyimpan data apa pun secara eksternal (misalnya dalam database).
Aplikasi Stateful memiliki sejumlah masalah, misalnya:
Oleh karena itu, ini adalah praktik terbaik untuk menghindari keadaan sisi-server (sekali lagi: kecuali jika disimpan secara eksternal dalam database).
Backend aplikasi web biasanya tidak perlu menyimpan status sesi apa pun karena mereka dapat menggunakan prinsip REST: status ditransfer antara klien dan server. Keadaan ini diwakili oleh URL, cookie, badan HTTP, dan sebagainya. Ini diperlukan karena HTTP adalah protokol stateless (semantik, tidak harus dalam dasar-dasar teknisnya).
Dengan soket web prinsip-prinsip ini sedikit rusak karena klien mempertahankan sesi / koneksi jangka panjang dengan server - dan koneksi itu melibatkan keadaan. Ini tidak bisa dihindari, tetapi Anda mengontrol apakah dan sampai taraf apa penggunaan soket web akan membahayakan desain backend yang tidak memiliki kewarganegaraan.
Benar-benar baik untuk mempertahankan struktur data dalam memori yang mengontrol koneksi mana yang dilanggankan pada peristiwa apa.
Itu bermasalah jika struktur data dalam memori adalah "sumber kebenaran" untuk informasi itu.
Secara umum, mempertahankan keadaan server internal baik-baik saja ketika salah satu dari yang berikut ini berlaku
sumber
Jika Anda menyimpan status pada server yang diperlukan untuk memproses permintaan masuk dari klien, maka server tersebut stateful. Dengan kata lain, itu menyatakan bahwa ia menyimpan dan perlu mengakses untuk memproses permintaan dari klien. Jadi, hashmap Anda adalah state sehingga server Anda stateful.
Sekarang, ada beberapa aplikasi web nyata yang melakukan hal-hal kaya yang tidak stateful sama sekali. Lagi pula, jika Anda akan memiliki login pengguna dan kemudian memproses permintaan atas perintah klien yang login, maka agak menurut definisi, Anda menyimpan status pada server yang berkaitan dengan klien tertentu dan server stateful , meskipun hanya untuk info masuk.
Jadi, saya tidak akan terlalu terpaku pada status nol di server. Yang penting adalah seberapa banyak keadaan yang ada di server, seberapa mahal (dalam hal pemrosesan, penyimpanan, dll ...) untuk menyimpan dan mengakses keadaan ini dan dapatkah Anda masih menskalakan aplikasi secara horizontal dengan keadaan ini. Dan, di mana pun keadaan praktis tetap dalam klien, bukan pada server. Sebagai contoh sepele, misalkan Anda memiliki aplikasi klien yang memiliki tombol "halaman berikutnya". Anda dapat menerapkan "halaman berikutnya" dengan kondisi sisi klien dari sisi sisi server.
Jika Anda memiliki keadaan sisi server untuk halaman saat ini dari klien, Anda bisa mengirim perintah ke server yang ingin Anda lihat halaman "selanjutnya". Server akan melihat statusnya untuk klien itu, menambah halaman, lalu mengembalikan data untuk halaman berikutnya.
Atau, Anda dapat menyimpan halaman saat ini di klien. Ketika klien menginginkan halaman berikutnya, ia mengambil nomor halaman saat ini, menambahnya dengan satu dan membuat permintaan umum untuk nomor halaman tertentu yang ingin dilihat selanjutnya.
Manakah dari implementasi ini yang menurut Anda memiliki skala yang lebih baik? Manakah yang lebih sederhana untuk diterapkan ketika pengguna membuka tab kedua melihat halaman yang berbeda? Yang lebih sederhana untuk skala horizontal. Jawaban untuk semua itu adalah yang tidak menyimpan halaman saat ini di server, tetapi menyimpannya di klien dan hanya membuat permintaan umum untuk halaman N ke server. Menjaga agar sisi klien sisi membuatnya lebih mudah untuk skala secara individual dan horizontal dan mendukung banyak tampilan untuk klien yang sama.
sumber