स्टेटफुल और स्टेटलेस में क्या अंतर है?


86

एमवीसी पर किताबें और प्रलेखन स्टेटफुल और स्टेटलेस शब्दों का उपयोग करने में हील हैं। सच कहूं तो, मैं सिर्फ इस विचार को हथियाने में असमर्थ हूं कि पुस्तकों के बारे में क्या बात कर रहे हैं। वे किसी भी राज्य को समझने के लिए एक उदाहरण नहीं देते हैं, बल्कि यह बताने के बजाय कि HTTP स्टेटलेस है और ASP.NET MVC microsoft के साथ जा रहा है। क्या मुझे कुछ मौलिक ज्ञान याद आ रहा है, क्योंकि मैं समझ नहीं पा रहा हूं कि राज्य क्या है और राज्य क्यों है और वही स्टेटलेस होता है।

एक साधारण और संक्षिप्त उदाहरण जो बटन या टेक्स्टबॉक्स जैसे नियंत्रण के बारे में बात करता है, वह मेरे द्वारा समझी गई समझ को सरल बना सकता है।

जवाबों:


40

स्टेटलेस का अर्थ है कि HTTP ने राज्यों के समर्थन में नहीं बनाया है; उदाहरण के लिए, यदि उपयोगकर्ता ने लॉग इन या कुछ और किया है तो आप स्टोर नहीं कर सकते।

उस समस्या को दूर करने के लिए सत्र का उपयोग करने के लिए सबसे आम समाधान है। इसका मतलब है कि आपको प्रत्येक प्रतिक्रिया या अनुरोध में सत्र पहचानकर्ता को शामिल करने में सक्षम होना चाहिए। यह या तो एक सत्र कुकी बनाने या सभी लिंक में सत्र पहचानकर्ता को शामिल करके किया जाता है।

WebForms उस सभी पारदर्शी (ViewState का उपयोग करके) बनाने की कोशिश करता है जबकि MVC आपको इसे मैन्युअल रूप से संभालने के लिए मजबूर करता है।

अपने उदाहरण में आपने बटन और टेक्स्टबॉक्स का उल्लेख किया है। उन्हें अपने राज्य को बनाए रखने का सबसे आसान तरीका बस पूरे पृष्ठ को वापस पोस्ट करने से रोकना है। MVC को ajax (jQuery के माध्यम से) के लिए उत्कृष्ट समर्थन मिला और मेरा सुझाव है कि यदि आप अभी पृष्ठ पर कुछ करना चाहते हैं तो आप ajax का उपयोग करें।


3
इसका मतलब यह है कि अगर मैं किसी वेबसाइट में लॉग इन हूं, तो हर पेज मैं सिर्फ सत्र पहचानकर्ता या सेशन कुकी के माध्यम से कंटेंट रेंडर करने से पहले प्रमाणीकरण के लिए आता है ??
पंकज उपाध्याय

3
हाँ, यह सही है।
jgauffin

तो स्टेटलेस बेहतर या बदतर है?
लुकास -

1
@ थिंक123: यह अधिक प्रदर्शनकारी है क्योंकि आपको राज्य का प्रबंधन करने की आवश्यकता नहीं है (अर्थात भार संतुलन आदि बहुत आसान है)। कृत्रिम अवस्था का प्रबंधन करने के बाद से यह कितना जटिल है।
jgauffin

5
@jgauffin: परफॉर्मेंट यहां गलत शब्द है। स्टेटलेस कम प्रदर्शन करने वाला है क्योंकि आपके पास राज्य को कैश करने का अवसर नहीं है और इसे बार-बार देखना पड़ता है। क्या यह अधिक स्केलेबल है ; यह वह जगह है जहाँ लोड बैलेंसिंग आती है, और स्केलेबिलिटी से प्राप्त लाभ प्रदर्शन में होने वाले नुकसान को दूर कर सकता है जब आपका सिस्टम काफी बड़ा हो जाता है।
मेसन व्हीलर

108

स्टेटलेस - कोई मेमोरी (राज्य) नहीं है जिसे प्रोग्राम द्वारा बनाए रखा गया है

स्टेटफुल - प्रोग्राम में एक मेमोरी (स्थिति) है

राज्य की अवधारणा को स्पष्ट करने के लिए, मैं एक फ़ंक्शन को परिभाषित करता हूं जो कि स्टेटफुल है और एक जो स्टेटलेस है

राज्यविहीन

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

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

स्टेटफुल

//The state is maintained by the function

private int _number = 0; //initially zero 

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

जैसा कि अन्य ने कहा है कि http स्वाभाविक रूप से स्टेटलेस है। तो राज्य आपके अनुप्रयोगों में बनाया जाना चाहिए।

वेब पर एक अनुरोध की कल्पना करें जहां आपके पास एक क्लाइंट ब्राउज़र है जो एक सर्वर प्रक्रिया के लिए संचार कर रहा है। स्टेटलेस http प्रोटोकॉल पर राज्य बनाए रखने के लिए ब्राउज़र आमतौर पर प्रत्येक अनुरोध पर सर्वर को एक सत्र पहचानकर्ता भेजेगा। प्रत्येक अनुरोध के लिए सर्वर "आह, उसका यह आदमी" जैसा होगा। राज्य की जानकारी को सर्वर साइड मेमोरी या इस सत्र आईडी के आधार पर डेटाबेस में देखा जा सकता है।

विशुद्ध रूप से स्टेटलेस वातावरण में आपको इस सत्र आईडी की आवश्यकता नहीं होगी। प्रत्येक अनुरोध में सर्वर को संसाधित करने के लिए आवश्यक सभी जानकारी होगी। लेकिन कई अनुप्रयोगों को कुछ सामग्री को देखने या एक उपयोगकर्ता क्या कर रहे हैं, इसका ट्रैक रखने के लिए एक सत्र प्रमाणित है या नहीं, इसका ट्रैक रखने के लिए राज्य को बनाए रखने की आवश्यकता है। आप प्रत्येक अनुरोध के लिए वायर पर उपयोगकर्ता क्रेडेंशियल्स नहीं भेजना चाहेंगे।


त्वरित प्रश्न: इसलिए यदि सत्र आईडी का उपयोग (यानी चुराया गया) किसी अन्य उपयोगकर्ता द्वारा किया जाता है, तो सर्वर को पता नहीं चलेगा कि यह कोई और है?
मिहई

4
यह सही है। उपयोगकर्ता की पहचान को सुरक्षित रखने के तरीके हैं जैसे कि https या httponly कुकीज़ का उपयोग करना। लेकिन अगर किसी उपयोगकर्ता के कंप्यूटर से छेड़छाड़ की जाती है, तो एक हमलावर सर्वर को यह सोचकर मूर्ख बना सकता है कि वे उपयोगकर्ता हैं।
कोडर

2
एक स्पष्ट और खस्ता कोड उदाहरण के लिए +1। मैं कभी भी अधिक आश्वस्त हूं कि अधिकांश जटिल आईटी शब्दों को केवल संदर्भ में समझा जा सकता है।
सेबस्टियन

सत्र आईडी के चोरी होने की संभावना एक कारण है कि आपको सावधान रहना होगा और सीएमएस जैसे अनुप्रयोगों या OAuth जैसी कुछ चीजों को बनाने के तरीके बनाने होंगे जो कि बहुत कठिन हैं।
एलिन

4
प्रत्येक अनुरोध के लिए सर्वर "आह, उसके इस आदमी" की तरह होगा - बेहतर ने कहा कि हर दूसरे उदाहरण में मैंने देखा है
राफेल ईनग

69

स्टेटलेस का मतलब है, अतीत की कोई याद नहीं। प्रत्येक लेन-देन ऐसा किया जाता है जैसे कि यह पहली बार किया जा रहा हो।

स्टेटफुल का अर्थ है कि अतीत की स्मृति। पिछले लेनदेन को याद किया जाता है और वर्तमान लेनदेन को प्रभावित कर सकता है।


9
यह जवाब दिया जाना चाहिए था। यह अब तक का सबसे स्पष्ट और सबसे सटीक उत्तर है।
16

3
सरल और सटीक।
इवान इवकोविक्व

2
यह उन लोगों के लिए सटीक है जो पहले से ही अंतर जानते हैं।
राफेल Eyng

3

मेरी सरल राय में ASP.NET (स्टेटफुल) और ASP.NET-MVC (स्टेटलेस) के बीच अंतर को इस तथ्य से अलग किया जा सकता है कि पहला सर्वर-साइड नियंत्रण प्रदान करता है और दूसरा नहीं।

यह ध्यान देने योग्य है कि ASP.NET वेब प्रपत्र दृष्टिकोण पुराने VB और VC ++ प्रोग्रामर को परिवर्तित करने की दिशा में सक्षम है, जो इवेंट मॉडल संचालित मॉडल में उपयोग किए जाते हैं, उसी इवेंट मॉडल प्रतिमान के बाद वेब प्रोग्रामिंग सीखने का एक अच्छा त्वरित तरीका है, जैसे कि क्लिक करें एक बटन और वोइला आप एक घटना को ट्रिगर! अब आपको केवल ईवेंट हैंडलर में अपना कोड लिखना होगा। इसकी वजह से ASP.NET को प्रत्येक राउंड ट्रिप को नियंत्रित करने वाले सर्वर साइड की स्थिति पर नजर रखने के लिए व्यू स्टेट और पोस्टबैक जैसी अवधारणाएं चाहिए।

ASP.NET-MVC, हालांकि, सर्वर-साइड नियंत्रण का उपयोग नहीं करता है, इसलिए इसे राज्य बनाए रखने की आवश्यकता नहीं है। MVC मॉडल समस्या डोमेन को तीन विभाजनों में अलग करता है ताकि डेटा को सुव्यवस्थित तरीके से ग्राहक तक पहुंचाया जा सके।

सारांश में, सर्वर-साइड नियंत्रण वे हैं जो उन्हें अलग-अलग बनाते हैं जहां तक ​​कि वे स्टेटफुल और स्टेटलेस हैं।


1

@Coder का उत्तर सटीक उत्तर।

राज्य का विचार पिछले डेटा को याद रखना है
उदाहरण के लिए, आपके पास "ए, बी, सी" और "ए" मूल्यों वाले सर्वर पर एक सूची नियंत्रण है। सूची क्लाइंट ब्राउज़र पर जाती है। आप "बी" का चयन करें। और सर्वर पर वापस पोस्ट करें। आपको कैसे पता चलेगा कि मूल्य बदल गया है?

  • ASP.NET
    Microsoft ASP.NET में ViewState शब्द का उपयोग करता है । इसे लेकर डेवलपर्स के बीच भारी गलतफहमी है।
    ViewState में सूची की सभी प्रारंभिक अवस्था है <input type="hidden" value="base64 encoded" />: मान "A, B, C" और "A चयनित है"।
    फिर पोस्ट बैक ब्राउजर से ViewState भेजता है और सर्वर को "B सिलेक्ट किया जाता है"। ASP.NET सूची की प्रारंभिक स्थिति को पुनर्स्थापित करता है और नए "बी" चयन को लागू करता है। यह WinForms Developers (@Ronald द्वारा उल्लिखित) को लुभाने के लिए किया गया था। वेब सर्वर पर आप सूची परिवर्तनों की सदस्यता ले सकते हैं listObject.Changed += OnChanged

  • ASP.NET MVC
    ViewState के साथ समस्या का आकार है। वर्षों के लिए .NET डेवलपर्स ने हर राउंडट्रिप के लिए 20 नियंत्रण वाले राज्यों की तरह, बेकार जानकारी को स्थानांतरित करने के लिए मजबूर किया।
    नया दृष्टिकोण केवल नए और छोटे "बी" मूल्य को भेजना है।
    या यदि आप "ए" से "बी" तक के परिवर्तन को ट्रैक करना चाहते हैं तो इसे अपने स्वयं के द्वारा लागू करें। जावास्क्रिप्ट का उपयोग करना और "वाज़ ए, नाउ बी" भेजना। या SQL सर्वर में ID द्वारा स्थिति को सहेजें और पुनः प्राप्त करें।

  • ASP.NET MVC और ASP.NET प्रमाणीकरण और कैशिंग के लिए राज्य लागू करता है। इसलिए यह कहना सही नहीं है कि ASP.NET MVC पूरी तरह से स्टेटलेस है।
  • उत्तर में उल्लिखित मेमोरी का अर्थ "याद रखना" है, न कि कंप्यूटर मेमोरी। स्टेट को फाइल सिस्टम, एसक्यूएल सर्वर या कंप्यूटर मेमोरी में डेटा स्टोर करके लागू किया जा सकता है।

कृपया रचनात्मक हो और माइनस डालने से पहले त्रुटि की व्याख्या करें
Artru

0

एक स्टेटफुल ऑपरेशन सिस्टम की कुछ स्थिति को संशोधित या आवश्यक करता है, और एक स्टेटलेस ऑपरेशन नहीं करता है।

स्टेटफुल टेक्स्टबॉक्स का उदाहरण StackExchange पर पहले से संपादित टिप्पणी होगी - टेक्स्टबॉक्स को आपकी पिछली टिप्पणी प्रदर्शित करने और यह जानने के लिए पोस्ट-थ्रेड की आवश्यकता होती है कि वह आपके इनपुट को स्वीकार करने और संसाधित करने के लिए शामिल थी।

एक मेल के साथ एक सामान्य ईमेल टिप्पणी फ़ॉर्म: टैग एक स्टेटलेस टेक्स्टबॉक्स होगा - यह आपके इनपुट को स्वीकार करता है और किसी भी जानकारी को बनाए रखने के बिना इसे आपके वर्कस्टेशन के मेल एप्लिकेशन को भेजता है।


एक विशिष्ट "अपना ईमेल पता और एक संदेश छोड़ें और हम आपको वापस मिल जाएंगे" फ़ॉर्म भी स्टेटलेस है। जब आप प्रपत्र सबमिट करते हैं तो सर्वर आपको परवाह नहीं करता है कि आप इसे कहाँ से प्राप्त करते हैं, और यह डेटा को कुछ ग्राहक सेवा टूडू सूची में कॉपी करता है और इसके बारे में भूल जाता है।
StarWeaver
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.