Stateless vs Stateful - Saya dapat menggunakan beberapa informasi konkret

94

Saya tertarik dengan artikel yang memiliki beberapa informasi konkret tentang desain stateless dan stateful dalam pemrograman. Saya tertarik karena saya ingin mempelajarinya lebih lanjut, tetapi saya benar-benar tidak dapat menemukan artikel bagus tentangnya. Saya telah membaca lusinan artikel di web yang secara samar-samar membahas subjek, atau mereka berbicara tentang server dan sesi web - yang juga tentang stateful vs stateless, tetapi saya tertarik dengan desain atribut stateless vs stateful dalam pengkodean . Contoh: Saya pernah mendengar bahwa kelas-BL tidak memiliki kewarganegaraan menurut desain, kelas entitas (atau setidaknya itulah yang saya sebut mereka - seperti Person (id, name, ..)) adalah stateful, dll.

Saya rasa ini penting untuk diketahui, karena saya yakin jika saya dapat memahaminya, saya dapat menulis kode yang lebih baik (mis. Dalam pikiran granularitas).

Bagaimanapun, sangat singkat, inilah yang saya ketahui tentang stateful vs stateless:

Stateful (seperti WinForms): Menyimpan data untuk digunakan lebih lanjut, tetapi membatasi skalabilitas aplikasi, karena dibatasi oleh CPU atau batas memori

Stateless (Seperti ASP.NET - meskipun ASP mencoba menjadi stateful dengan Kondisi Tampilan): Setelah tindakan selesai, data akan ditransfer, dan instance akan dikembalikan ke kumpulan utas (Amorf).

Seperti yang Anda lihat, informasinya cukup kabur dan terbatas (dan cukup fokus pada interaksi server), jadi saya akan sangat berterima kasih jika Anda dapat memberi saya beberapa informasi yang lebih enak :)

Tim-JoKi
sumber

Jawaban:

58

Saya menyarankan Anda memulai dari pertanyaan di StackOverflow yang membahas keuntungan dari pemrograman tanpa negara. Ini lebih dalam konteks pemrograman fungsional, tetapi apa yang akan Anda baca juga berlaku dalam paradigma pemrograman lain.

Pemrograman stateless terkait dengan pengertian matematika dari suatu fungsi, yang ketika dipanggil dengan argumen yang sama, selalu mengembalikan hasil yang sama. Ini adalah konsep kunci dari paradigma pemrograman fungsional dan saya berharap Anda dapat menemukan banyak artikel yang relevan di bidang itu.

Area lain yang dapat Anda teliti untuk mendapatkan lebih banyak pemahaman adalah layanan web RESTful. Ini dengan desain "stateless", berbeda dengan teknologi web lain yang mencoba mempertahankan status. (Faktanya apa yang Anda katakan bahwa ASP.NET adalah stateless tidak benar - ASP.NET berusaha keras untuk menjaga status menggunakan ViewState dan pasti akan ditandai sebagai stateful. ASP.NET MVC di sisi lain adalah teknologi stateless). Ada banyak tempat yang membahas "keadaan tanpa kewarganegaraan" dari layanan web RESTful (seperti tempat blog ini ), tetapi Anda dapat memulai lagi dari pertanyaan SO .

kgiannakakis
sumber
Baiklah, terima kasih atas infonya, saya telah melihat tautannya dan saya menemukan beberapa informasi menarik! Meskipun saya masih terbuka untuk lebih;)
Team-JoKi
Saya telah menambahkan area lain yang stateful dan stateless merupakan faktor penting (layanan web RESTful).
kgiannakakis
Terimakasih atas infonya! Saya akan memilih jawaban Anda tetapi saya belum memiliki cukup perwakilan> _>
Team-JoKi
banyak aplikasi web yang statefull karena halaman pendaftaran yang sama memberikan hasil yang berbeda untuk kredit pengguna ... Pertama kali mendaftar akan berhasil ... kedua kalinya dengan input yang sama, pendaftaran akan gagal .... karena aplikasi web memiliki status pengguna di suatu tempat disimpan .. .itu mungkin database atau penyimpanan yang berbeda
merasa nyaman dan memprogram
85

Tanpa kewarganegaraan berarti tidak ada memori masa lalu. Setiap transaksi dilakukan seolah-olah baru pertama kali dilakukan.

Stateful artinya ada memori masa lalu. Transaksi sebelumnya akan diingat dan dapat mempengaruhi transaksi saat ini.

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;
}

Merujuk dari: /software/101337/whats-the-difference-between-stateful-and-stateless

Ankit
sumber
73

Sebuah stateful aplikasi adalah salah satu yang menyimpan informasi tentang apa yang telah terjadi atau berubah sejak mulai berjalan. Setiap info publik tentang "mode" apa itu, atau berapa banyak record yang telah diproses, atau apa pun, membuatnya menjadi stateful.

Aplikasi tanpa negara tidak mengekspos informasi itu. Mereka memberikan respons yang sama ke permintaan, fungsi, atau panggilan metode yang sama, setiap saat. HTTP tidak memiliki kewarganegaraan dalam bentuk aslinya - jika Anda melakukan GET ke URL tertentu, Anda (secara teoritis) mendapatkan respons yang sama setiap saat. Pengecualian tentu saja adalah ketika kita mulai menambahkan statefulness di atas, misalnya dengan aplikasi web ASP.NET :) Tetapi jika Anda memikirkan situs web statis dengan hanya file dan gambar HTML, Anda akan tahu apa yang saya maksud.

Lucas Wilson-Richter
sumber
18

Kata sifat Stateful atau Stateless hanya mengacu pada keadaan percakapan, tidak ada hubungannya dengan konsep fungsi yang memberikan keluaran yang sama untuk masukan yang sama. Jika demikian, aplikasi web dinamis apa pun (dengan database di belakangnya) akan menjadi layanan stateful, yang jelas salah. Dengan pemikiran ini, jika saya mempercayakan tugas untuk menjaga status percakapan dalam teknologi yang mendasarinya (seperti sesi coockie atau http), saya menerapkan layanan stateful, tetapi jika semua informasi yang diperlukan (konteks) diteruskan sebagai parameter saya ' m menerapkan layanan tanpa kewarganegaraan. Perlu diperhatikan bahwa meskipun parameter yang diteruskan adalah "pengenal" dari status percakapan (mis. Tiket atau sessionId) kami masih beroperasi di bawah layanan stateless,

Marco
sumber
Tidak yakin apakah menyampaikan session identifiersetiap permintaan dapat dianggap tanpa kewarganegaraan. Menurut saya, kasus seperti itu akan dianggap stateful. Namun, jika Anda selalu memberikan tokenuntuk pengguna tetapi tidak memiliki status lain apa pun, selain status tanpa kewarganegaraan. Tapi terasa XD stateful. Ini sangat membingungkan.
7hi4g0
4

Uang yang ditransfer secara online dari satu rekening ke rekening lain adalah stateful, karena rekening penerima mempunyai informasi tentang pengirim. Menyerahkan uang tunai dari seseorang kepada orang lain, transaksi ini tidak memiliki kewarganegaraan, karena setelah uang tunai diterima, identitas pemberi tidak ada dengan uang tunai tersebut.

S Upendra rao
sumber
1

Hanya untuk menambahkan kontribusi orang lain .... Cara lain adalah melihatnya dari server web dan sudut pandang konkurensi ...

HTTP bersifat stateless karena suatu alasan ... Dalam kasus server web, menjadi stateful berarti harus mengingat 'status' pengguna untuk koneksi terakhir mereka, dan / atau menjaga koneksi terbuka ke pemohon. Itu akan sangat mahal dan 'menegangkan' dalam aplikasi dengan ribuan koneksi bersamaan ...

Menjadi stateless dalam hal ini memiliki penggunaan sumber daya yang jelas dan efisien ... yaitu mendukung koneksi dalam satu contoh permintaan dan respons ... Tidak ada overhead untuk menjaga koneksi tetap terbuka dan / atau mengingat apa pun dari permintaan terakhir ...

Ken.Fukizi
sumber
-3

Kita membuat Webapps statefull dengan menimpa perilaku stateless HTTP dengan menggunakan objek sesi. Saat kita menggunakan objek sesi, status dijalankan tetapi kita masih menggunakan HTTP saja.

merasa baik dan memprogram
sumber
-3

Saya memiliki keraguan yang sama tentang desain kelas stateless v / s stateful dan melakukan penelitian. Baru saja selesai dan temuan saya telah diposting di blog saya

  • Kelas entitas harus stateful
  • Kelas helper / worker tidak boleh stateful.
Joy George Kunjikkuru
sumber