Apa perbedaan antara stateful dan stateless?

86

Buku-buku dan dokumentasi tentang MVC hanya menumpuk menggunakan istilah Stateful dan Stateless. Sejujurnya, saya hanya tidak dapat mengambil ide itu, apa yang dibicarakan buku-buku itu. Mereka tidak memberikan contoh untuk memahami salah satu dari kedua negara, bukan hanya mengatakan bahwa HTTP adalah stateless dan dengan ASP.NET MVC microsoft akan ikut serta. Apakah saya kehilangan beberapa pengetahuan mendasar, karena saya tidak dapat memahami apa yang stateful dan mengapa stateful dan sama berlaku untuk stateless.

Contoh sederhana dan pendek yang berbicara tentang tombol kontrol seperti atau kotak teks dapat menyederhanakan pemahaman saya kira.

Pankaj Upadhyay
sumber

Jawaban:

40

Stateless berarti bahwa HTTP tidak memiliki dukungan bawaan untuk negara; mis. Anda tidak dapat menyimpan jika pengguna telah login atau melakukan sesuatu yang lain.

Solusi paling umum adalah menggunakan sesi untuk mengatasi masalah itu. Ini berarti bahwa Anda harus dapat menyertakan pengidentifikasi sesi dalam setiap respons atau permintaan. Ini dilakukan dengan membuat cookie sesi atau dengan memasukkan pengidentifikasi sesi di semua tautan.

WebForms mencoba untuk membuat semua itu transparan (menggunakan ViewState) sementara MVC memaksa Anda untuk menanganinya secara manual.

Dalam contoh Anda, Anda menyebutkan Buttons dan TextBoxes. Cara termudah untuk membiarkan mereka mempertahankan status mereka adalah dengan berhenti mengirim kembali seluruh halaman. MVC mendapat dukungan yang sangat baik untuk ajax (melalui jQuery) dan saya sarankan Anda menggunakan ajax jika Anda hanya ingin melakukan sesuatu di halaman saat ini.

jgauffin
sumber
3
ini berarti jika saya masuk ke sebuah situs web, setiap halaman yang saya kunjungi hanya memeriksa ulang untuk otentikasi sebelum memberikan konten melalui pengidentifikasi sesi atau cookie sesi ??
Pankaj Upadhyay
3
ya itu benar.
jgauffin
jadi apakah kewarganegaraan lebih baik atau lebih buruk?
Lucas - Akademi Pengkodean yang Lebih Baik
1
@ think123: Ini lebih berkinerja karena Anda tidak harus mengatur status (mis. load balancing dll jauh lebih mudah). Itu jauh lebih rumit karena Anda harus mengelola keadaan buatan.
jgauffin
5
@ jgauffin: Pelaku adalah kata yang salah di sini. Stateless kurang berkinerja karena Anda tidak memiliki kesempatan untuk melakukan cache negara dan harus mencarinya berulang kali. Apa itu lebih skalabel ; di situlah load balancing masuk, dan keuntungan dari skalabilitas dapat mengimbangi kerugian dalam kinerja ketika sistem Anda menjadi cukup besar.
Mason Wheeler
108

Stateless - Tidak ada memori (status) yang dikelola oleh program

Stateful - Program memiliki memori (status)

Untuk menggambarkan konsep negara saya akan mendefinisikan fungsi yang stateful dan yang stateless

Tanpa kewarganegaraan

//The state is derived by what is passed into the function

function int addOne(int number)
{
    return number + 1;
}

Stateful

//The state is maintained by the function

private int _number = 0; //initially zero 

function int addOne()
{
    _number++;
    return _number;
}

Seperti yang orang lain katakan, http pada dasarnya tidak bernegara. Jadi status harus dibangun ke dalam aplikasi Anda.

Bayangkan permintaan melalui web di mana Anda memiliki browser klien yang berkomunikasi dengan proses server. Untuk mempertahankan status melalui protokol http stateless, browser akan mengirim biasanya mengirim pengidentifikasi sesi ke server pada setiap permintaan. Untuk setiap permintaan server akan seperti "ah, ini orangnya". Informasi negara kemudian dapat dilihat dalam memori sisi server atau dalam database berdasarkan id sesi ini.

Dalam lingkungan yang murni tanpa kewarganegaraan, Anda tidak memerlukan id sesi ini. Setiap permintaan akan berisi semua informasi yang perlu diproses oleh server. Tetapi banyak aplikasi perlu mempertahankan status untuk melacak apakah suatu sesi diautentikasi untuk melihat konten tertentu atau untuk melacak apa yang dilakukan pengguna. Anda tidak ingin mengirim kredensial pengguna melalui kawat untuk setiap permintaan.

pembuat kode
sumber
pertanyaan cepat: jadi jika ID sesi digunakan (yaitu dicuri) oleh pengguna lain, server tidak akan tahu ini orang lain?
mihai
4
Itu benar. Ada beberapa cara untuk melindungi identitas pengguna seperti menggunakan https atau httpon cookies. Tetapi jika komputer pengguna dikompromikan maka penyerang bisa menipu server untuk berpikir bahwa mereka adalah pengguna.
coder
2
+1 untuk contoh kode yang jelas dan renyah. Saya semakin yakin bahwa istilah IT paling kompleks hanya dapat dipahami dalam konteks.
Sebastian
Kemungkinan ID sesi dicuri adalah salah satu alasan Anda harus berhati-hati dan aplikasi seperti CMS atau sesuatu seperti OAuth membangun cara untuk melakukan hal itu jauh lebih sulit.
Elin
4
Untuk setiap permintaan server akan seperti "ah, ini orangnya" - lebih baik mengatakan bahwa dalam setiap contoh lain yang pernah saya lihat
Rafael Eyng
69

kewarganegaraan berarti tidak ada memori masa lalu. Setiap transaksi dilakukan seolah-olah itu dilakukan untuk pertama kalinya.

statefull berarti ada memori masa lalu. Transaksi sebelumnya diingat dan dapat mempengaruhi transaksi saat ini.

CWallach
sumber
9
Seharusnya jawaban ini diberikan. Sejauh ini, inilah jawaban yang paling jelas dan paling tepat di sini.
Mawg
3
Sederhana dan akurat.
Ivan Ivković
2
Ini akurat untuk siapa saja yang sudah tahu bedanya.
Rafael Eyng
3

Menurut pendapat sederhana saya perbedaan antara ASP.NET (stateful) dan ASP.NET-MVC (stateless) dapat diisolasi dengan fakta bahwa yang pertama menyediakan kontrol sisi server dan yang lainnya tidak.

Perlu dicatat bahwa pendekatan formulir web ASP.NET diarahkan untuk mentransisikan pemrogram VB dan VC ++ lama yang digunakan dalam model yang didorong model untuk memiliki cara cepat yang baik untuk mempelajari pemrograman web mengikuti paradigma model acara yang sama, seperti Anda mengklik sebuah tombol dan voila Anda memicu suatu acara! Yang perlu Anda lakukan sekarang adalah menulis kode Anda di event handler. Karena itu ASP.NET perlu memiliki konsep seperti view state dan postbacks untuk memantau keadaan sisi server mengontrol setiap round trip.

ASP.NET-MVC, bagaimanapun, tidak menggunakan kontrol sisi-server sehingga tidak harus mempertahankan status. Model MVC memisahkan domain masalah menjadi tiga partisi sehingga data dikirim ke klien secara efisien.

Singkatnya, kontrol sisi server adalah apa yang membuat mereka berbeda sejauh statusnya dan stateless.

Ronald
sumber
1

Tambahan jawaban tepat @coder.

Gagasan negara adalah untuk mengingat data sebelumnya .
Misalnya, Anda memiliki kontrol daftar di server dengan nilai "A, B, C" dan "A" dipilih. Daftarnya masuk ke browser klien. Anda memilih "B". Dan memposting kembali ke server. Bagaimana Anda tahu bahwa nilainya berubah?

  • ASP.NET
    Microsoft menggunakan istilah ViewState di ASP.NET. Ada kesalahpahaman besar di antara pengembang tentang hal itu.
    ViewState menyimpan semua keadaan awal daftar di <input type="hidden" value="base64 encoded" />: nilai "A, B, C" dan tandai "A dipilih".
    Kemudian dengan post back browser mengirimkan ViewState dan "B dipilih" ke server. ASP.NET mengembalikan keadaan awal daftar dan menerapkan pilihan "B" baru. Ini dilakukan untuk memikat pengembang WinForms (disebutkan oleh @Ronald). Di server web, Anda dapat berlangganan perubahan daftar listObject.Changed += OnChanged.

  • ASP.NET MVC
    Masalah dengan ViewState adalah ukurannya. Selama bertahun-tahun. Pengembang NET terpaksa mentransfer kilobyte informasi yang tidak berguna, seperti status 20 kontrol untuk setiap perjalanan pulang-pergi.
    Pendekatan baru ini hanya mengirim nilai "B" yang baru dan kecil.
    Atau jika Anda ingin melacak perubahan dari "A" ke "B" kemudian implementasikan sendiri. Menggunakan javascript dan mengirim "Was A, Now B". Atau simpan dan ambil status dengan ID di SQL Server.

  • ASP.NET MVC dan ASP.NET mengimplementasikan status untuk Otentikasi dan Pencairan. Jadi tidak benar untuk mengatakan bahwa ASP.NET MVC sepenuhnya tanpa kewarganegaraan.
  • Memori yang disebutkan dalam jawaban berarti "mengingat", bukan memori komputer. Status dapat diimplementasikan dengan menyimpan data dalam sistem File, SQL server atau Memori Komputer.
Artru
sumber
mohon konstruktif dan jelaskan kesalahan sebelum meletakkan minus
Artru
0

Operasi stateful memodifikasi atau memerlukan beberapa keadaan sistem, dan operasi stateless tidak.

Contoh kotak teks stateful akan menjadi komentar yang diedit sebelumnya di StackExchange - kotak teks perlu menampilkan komentar Anda sebelumnya dan tahu post-thread yang terlibat dengan itu untuk menerima dan memproses input Anda.

Formulir komentar email umum dengan tag mailto: akan berupa kotak teks tanpa kewarganegaraan - ia menerima input Anda dan melemparkannya ke aplikasi email workstation Anda tanpa menyimpan informasi apa pun.

Lonstar
sumber
Formulir khas "tinggalkan alamat email dan pesan Anda dan kami akan membalasnya" juga tidak memiliki kewarganegaraan. Saat Anda mengirimkan formulir, server tidak akan peduli dari mana Anda mendapatkannya, dan itu hanya menyalin data ke beberapa daftar layanan pelanggan dan lupa tentangnya.
StarWeaver