rest - यदि आरईएसटी अनुप्रयोगों को स्टेटलेस माना जाता है, तो आप सत्रों का प्रबंधन कैसे करते हैं?




session-state (8)

क्या वे सिर्फ कह रहे हैं कि सत्र / एप्लिकेशन स्तर डेटा स्टोर का उपयोग न करें ???

नहीं। वे एक छोटे से तरीके से नहीं कह रहे हैं।

वे कह रहे हैं कि "सत्र" को परिभाषित न करें। लॉगिन मत करो लॉगआउट मत करो। अनुरोध के साथ प्रमाण पत्र प्रदान करें। प्रत्येक अनुरोध अकेले खड़ा है।

आपके पास अभी भी डेटा स्टोर हैं। आपके पास अभी भी प्रमाणीकरण और प्रमाणीकरण है। आप बस सत्र स्थापित करने और सत्र स्थिति बनाए रखने में समय बर्बाद नहीं करते हैं।

मुद्दा यह है कि प्रत्येक अनुरोध (ए) पूरी तरह से अकेला खड़ा होता है और (बी) किसी भी वास्तविक काम के बिना एक विशाल समांतर सर्वर फार्म के लिए छोटे से खेती की जा सकती है। अपाचे या स्क्विड अंधेरे और सफलतापूर्वक आसपास के अनुरोधों को पारित कर सकता है।

क्या होगा अगर मेरे पास संदेशों की कतार थी, और मेरा उपयोगकर्ता संदेश पढ़ना चाहता था, लेकिन जैसा कि उन्होंने उन्हें पढ़ा था, तो अपने सत्र की अवधि के लिए आने वाले कुछ प्रेषक संदेशों को अवरुद्ध करना चाहते थे?

यदि उपयोगकर्ता फ़िल्टर चाहता है, तो बस प्रत्येक अनुरोध पर फ़िल्टर प्रदान करें।

क्या यह समझ में नहीं आता है ... क्या सर्वर केवल संदेश भेजता है (या संदेश आईडी) जो उपयोगकर्ता द्वारा अवरुद्ध नहीं किया गया था?

हाँ। रीस्टफुल यूआरआई अनुरोध में फ़िल्टर प्रदान करें।

जब भी मैं नई संदेश सूची का अनुरोध करता हूं, क्या मुझे वास्तव में संदेश प्रेषकों की पूरी सूची को ब्लॉक करने के लिए भेजना पड़ता है?

हाँ। यह "संदेश प्रेषकों की सूची को अवरुद्ध करने की सूची" कितनी बड़ी हो सकती है? पीके की एक छोटी सूची?

एक जीईटी अनुरोध बहुत बड़ा हो सकता है। यदि आवश्यक हो, तो आप एक पोस्ट अनुरोध का प्रयास कर सकते हैं भले ही यह एक तरह की क्वेरी की तरह लगता है।

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

विकिपीडिया से:

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

क्या वे सिर्फ कह रहे हैं कि सत्र / एप्लिकेशन स्तर डेटा स्टोर का उपयोग न करें ???

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

क्या होगा अगर मेरे पास संदेशों की कतार थी, और मेरा उपयोगकर्ता संदेश पढ़ना चाहता था, लेकिन जैसा कि उन्होंने उन्हें पढ़ा था, तो अपने सत्र की अवधि के लिए आने वाले कुछ प्रेषक संदेशों को अवरुद्ध करना चाहते थे? सर्वर सर्वर पर किसी स्थान पर इसे स्टोर करने के लिए यह समझदारी नहीं होगी, और क्या सर्वर केवल संदेश (या संदेश आईडी) भेजता है जो उपयोगकर्ता द्वारा अवरुद्ध नहीं किया गया था?

जब भी मैं नई संदेश सूची का अनुरोध करता हूं, क्या मुझे वास्तव में संदेश प्रेषकों की पूरी सूची को ब्लॉक करने के लिए भेजना पड़ता है? मेरे लिए प्रासंगिक संदेश सूची पहले स्थान पर सार्वजनिक रूप से उपलब्ध संसाधन भी नहीं होगी / नहीं।

फिर, बस इसे समझने की कोशिश कर रहा है। कृपया कोई स्पष्टीकरण दें।

अद्यतन करें:

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


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

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

हां, http प्रोटोकॉल अनिवार्य रूप से एक स्टेटलेस प्रोटोकॉल है लेकिन इसे स्टेटफुल बनाने के लिए हम हमें HTTP कुकीज़ बनाते हैं। तो, डिफ़ॉल्ट रूप से SOAP है। लेकिन यह वही बना सकता है, जो आप उपयोग कर रहे ढांचे पर निर्भर करता है।

HTTP स्टेटलेस है लेकिन फिर भी हम विभिन्न जावा ट्रैकिंग तंत्र का उपयोग करके हमारे जावा एप्लिकेशन में सत्र बनाए रख सकते हैं।

हां, हम webservice में सत्र भी बनाए रख सकते हैं चाहे वह आरईएसटी या एसओएपी हो। इसे किसी भी तृतीय पक्ष लाइब्रेरी का उपयोग करके कार्यान्वित किया जा सकता है या आप स्वयं ही कार्यान्वित कर सकते हैं।

http://gopaldas.org/webservices/soap/webservice-is-stateful-or-stateless-rest-soap से लिया गया


मौलिक स्पष्टीकरण है:

सर्वर पर कोई क्लाइंट सत्र स्थिति नहीं।

स्टेटलेस द्वारा इसका मतलब है कि सर्वर किसी भी स्थिति को सर्वर के पक्ष में क्लाइंट सत्र के बारे में संग्रहीत नहीं करता है।

ग्राहक सत्र क्लाइंट पर संग्रहीत किया जाता है। सर्वर स्टेटलेस का मतलब है कि प्रत्येक सर्वर किसी भी समय किसी भी ग्राहक की सेवा कर सकता है, कोई सत्र एफ़िनिटी या चिपचिपा सत्र नहीं है । प्रासंगिक सत्र जानकारी क्लाइंट पर संग्रहीत होती है और आवश्यकतानुसार सर्वर को पास की जाती है।

यह उन अन्य सेवाओं को रोकता नहीं है जो वेब सर्वर व्यवसाय की वस्तुओं जैसे कि शॉपिंग कार्ट के बारे में राज्य को बनाए रखने से बात करता है, सिर्फ क्लाइंट के वर्तमान एप्लिकेशन / सत्र स्थिति के बारे में नहीं।

क्लाइंट की एप्लिकेशन स्थिति को सर्वर पर कभी भी संग्रहित नहीं किया जाना चाहिए, लेकिन ग्राहक से हर जगह उस स्थान पर पारित किया जाना चाहिए।

यही वह जगह है जहां आरईएसटी में एसटी , राज्य हस्तांतरण से आता है। सर्वर को स्टोर करने के बजाय आप राज्य को स्थानांतरित करते हैं। लाखों समवर्ती उपयोगकर्ताओं को स्केल करने का यही एकमात्र तरीका है। यदि किसी अन्य कारण से नहीं, क्योंकि लाखों सत्र लाखों सत्र हैं।

सत्र प्रबंधन का भार सभी ग्राहकों में amortized है, ग्राहक अपने सत्र राज्य स्टोर करते हैं और सर्वर एक स्टेटलेस फैशन में परिमाण या अधिक ग्राहकों के कई आदेशों की सेवा कर सकते हैं।

यहां तक ​​कि ऐसी सेवा के लिए जो आपको लगता है कि केवल 10 हजार समवर्ती उपयोगकर्ताओं में ही आवश्यकता होगी, आपको अभी भी अपनी सेवा को स्टेटलेस बनाना चाहिए। हजारों हजारों अभी भी हजारों हैं और इसके साथ जुड़े समय और अंतरिक्ष लागत भी होगी।

स्टेटलेस यह है कि सामान्य रूप से HTTP प्रोटोकॉल और वेब को संचालित करने के लिए डिज़ाइन किया गया था और एक समग्र सरल कार्यान्वयन है और सत्र स्थिति का एक समूह बनाए रखने के लिए सर्वर साइड लॉजिक के समूह के बजाय आपके पास एक कोड कोड है।

कुछ बहुत बुनियादी कार्यान्वयन सिद्धांत हैं:

ये सिद्धांत सिद्धांत नहीं हैं, आप इन सिद्धांतों को कैसे पूरा करते हैं, अलग-अलग हो सकते हैं।

संक्षेप में, पांच प्रमुख सिद्धांत हैं:

  1. प्रत्येक "चीज़" एक आईडी दें
  2. एक साथ चीजों को लिंक करें
  3. मानक तरीकों का प्रयोग करें
  4. कई प्रतिनिधित्व के साथ संसाधन
  5. Statelessly संवाद

आरईएसटी dissertation में प्रमाणीकरण या प्रमाणीकरण के बारे में कुछ भी नहीं है।

क्योंकि ऐसे अनुरोध को प्रमाणित करने से कुछ भी अलग नहीं है जो कि किसी से नहीं है। प्रमाणीकरण विश्वसनीय चर्चा के लिए अप्रासंगिक है।

अपनी विशेष आवश्यकताओं के लिए एक स्टेटलेस एप्लिकेशन बनाने का तरीका बताते हुए, स्टैक ओवरफ्लो के लिए बहुत व्यापक है।

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

इस पर सहायता / जानकारी मांगने के लिए टिप्पणियां अभी तक किसी भी लंबी आवश्यकता के रूप में ध्वजांकित नहीं की जानी चाहिए


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

जैसे ही आप किसी विशिष्ट ग्राहक की इंटरैक्शन से संबंधित कुछ जानकारी प्रबंधित करने के लिए सर्वर पर थोड़ी सी ज़िम्मेदारी डालते हैं, वह बोझ सर्वर का उपभोग करने के लिए जल्दी से बढ़ सकता है।

यह एक व्यापार बंद है।


आरईएसटी बहुत सार है। यह कुछ अच्छे, सरल, असली दुनिया के उदाहरणों में मदद करता है।

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

इसका कारण यह है कि, सर्वर ने आपके सत्र स्थिति को संग्रहीत नहीं किया है। अफसोस की बात है, आपकी स्क्रॉल स्थिति सिर्फ क्लाइंट पर रैम में संग्रहीत की गई थी।

सौभाग्य से आपको फिर से कनेक्ट होने पर लॉग इन करने की आवश्यकता नहीं है, लेकिन ऐसा इसलिए है क्योंकि आपके क्लाइंट-साइड भी संग्रहीत लॉगिन प्रमाणपत्र की समयसीमा समाप्त नहीं हुई है। ऐप हटाएं और पुनः इंस्टॉल करें, और आपको वापस लॉग इन करना होगा, क्योंकि सर्वर ने आपके आईपी पते को आपके सत्र से संबद्ध नहीं किया है।

आपके पास सर्वर पर लॉगिन सत्र नहीं है, क्योंकि वे आरईएसटी का पालन करते हैं।

अब उपर्युक्त उदाहरणों में एक वेब ब्राउज़र शामिल नहीं है, लेकिन बैक एंड पर, ऐप्स अपने मेजबान सर्वर के साथ HTTPS के माध्यम से संचार कर रहे हैं। मेरा मुद्दा यह है कि आरईएसटी में कुकीज़ और ब्राउज़र्स इत्यादि शामिल नहीं हैं। क्लाइंट-साइड सत्र स्थिति को संग्रहीत करने के कई साधन हैं।

लेकिन एक दूसरे के लिए वेब ब्राउज़र के बारे में बात करते हैं, क्योंकि इससे आरईएसटी का एक और बड़ा फायदा सामने आता है कि यहां कोई भी बात नहीं कर रहा है।

यदि सर्वर सत्र स्थिति संग्रहीत करने का प्रयास करता है, तो यह प्रत्येक ग्राहक को कैसे पहचानना चाहिए?

यह उनके आईपी पते का उपयोग नहीं कर सका, क्योंकि कई लोग साझा राउटर पर उसी पते का उपयोग कर सकते थे। तो फिर कैसे?

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

यदि सर्वर को आपको पहचानने के लिए कुछ क्लाइंट-साइड स्टेटस को स्टोर करना है, तो इसे अपने अनुरोधों को संसाधित करने के लिए जितना समय लगता है, उससे अधिक RAM में इसे स्टोर करना होगा, अन्यथा इसे उस डेटा को कैश करना होगा। सर्वर में प्रोसेसर की गति का उल्लेख न करने के लिए सीमित मात्रा में रैम और कैश होता है। सर्वर-साइड स्टेटस सभी तीनों में तेजी से जोड़ता है। इसके अलावा यदि सर्वर आपके सत्रों के बारे में किसी भी राज्य को स्टोर करने जा रहा है, तो उसे प्रत्येक ब्राउज़र और ऐप के लिए इसे अलग से स्टोर करना होगा, जिसमें आप वर्तमान में लॉग इन हैं, और आपके द्वारा उपयोग किए जाने वाले प्रत्येक अलग-अलग डिवाइस के लिए भी।

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

जहां लोग भ्रमित हो जाते हैं, यह सोचकर कि "राज्य" डेटाबेस में संग्रहीत जानकारी को संदर्भित करता है। नहीं, यह किसी भी जानकारी को संदर्भित करता है जिसे सर्वर के रैम में होने की आवश्यकता होती है जब आप इसका उपयोग कर रहे हों।


इस प्रस्तुति पर एक नज़र डालें।

http://youtu.be/MRxTP-rQ-S8

इस पैटर्न के अनुसार - यदि वास्तव में आवश्यक हो तो राज्य का प्रबंधन करने के लिए क्षणिक विश्राम संसाधन बनाएं। स्पष्ट सत्र से बचें।


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

सर्वर पर राज्य का प्रबंधन करने का अर्थ है कि आपका सर्वर जानता है कि क्लाइंट क्या कर रहा है (एप्लिकेशन का कौन सा पृष्ठ देख रहा है)। और यही वह है जिसे आपको करने की आवश्यकता नहीं है।

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

कोई तर्क दे सकता है कि क्लाइंट को बेहतर टोकन उत्पन्न करना चाहिए। मैं कहता हूं कि यह दोनों तरीकों से काम करता है, और यह एप्लिकेशन पर निर्भर करेगा, और जो एपीआई के साथ काम करने जा रहा है।

सर्वर पर कुछ संवेदनशील सत्र डेटा को रखने का सही तरीका होना चाहिए। आप अपने शॉपिंग कार्ट को रखने के लिए ग्राहक पर भरोसा नहीं कर सकते हैं (उदाहरण के लिए) "isFreeGift" नामक एक फ़ील्ड है। ऐसी जानकारी सर्वर पर रखी जानी चाहिए।

उनके जवाब में संतानु डे द्वारा प्रदान किया गया वीडियो लिंक सहायक है। यदि आपने नहीं किया है तो इसे देखें।

बस एक तरफ ध्यान दें: ऐसा लगता है कि पहले से दिए गए सभी उत्तर इस तथ्य की उपेक्षा करते हैं कि कुछ परिचालन सर्वर पर भारी भार पैदा कर सकते हैं। यह बिजली की खपत, हार्डवेयर खपत, और लागत (सीपीयू चक्र द्वारा किराए पर सर्वर के लिए) के संदर्भ में प्रासंगिक है। एक अच्छा डेवलपर अपने आवेदन को अनुकूलित करने में आलसी नहीं होना चाहिए, भले ही ऑपरेशन कुछ किराए पर सर्वर पर एक आधुनिक सीपीयू पर बहुत जल्दी किया जा सके, जिसके लिए वे अपनी बिजली और रखरखाव बिल का भुगतान नहीं करते हैं।

सवाल यह है कि सवाल कुछ साल पुराना है, मुझे उम्मीद है कि मेरा जवाब अभी भी सहायक होगा।


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

आईएमओ, एपीआई स्टेटलेस होना चाहिए जो वास्तव में तेजी से स्केल करने की अनुमति देता है।







session-state