2010-03-30 12 views
5

वर्तमान में हम अपनी WCF सेवा डिजाइन और एक बात है कि मुझे परेशान कर रहा है की समीक्षा कर रहे हैं फैसला है के बीच प्रति कॉल और प्रति सत्र सेवाएं। मेरा मानना ​​है कि मैं दोनों के पीछे अवधारणा को समझता हूं, लेकिन मुझे वास्तव में पे-कॉल सेवाओं का लाभ नहीं दिख रहा है। मैं समझता हूं कि प्रति-कॉल सेवाओं का उपयोग करने के लिए प्रेरणा यह है कि एक डब्ल्यूसीएफ सेवा केवल कॉल के जीवन के लिए एक सर्वर ऑब्जेक्ट रखती है जिससे सेवा आवृत्ति द्वारा महंगी संसाधन आयोजित किया जाता है, लेकिन मेरे लिए उपयोग करने के लिए यह बहुत आसान है अधिक ओओ-जैसे प्रति-सत्र मॉडल जहां आपका प्रॉक्सी ऑब्जेक्ट उदाहरण हमेशा एक ही सर्वर ऑब्जेक्ट इंस्टेंस पर corrisponds और मैन्युअल रूप से किसी भी महंगी संसाधन को संभालता है।WCF: प्रति-कॉल और प्रति सत्र सेवाओं ... जरूरत समझाने कि प्रति कॉल सार्थक

उदाहरण के लिए, मैं जोड़ने, अपडेट करने हटाएँ, उस पर तरीकों चयन युक्त CRUD सेवा है का कहना है। यह सर्वर ऑब्जेक्ट कन्स्ट्रक्टर में डेटाबेस कनेक्शन ("महंगी संसाधन") के साथ प्रति-कॉल सेवा के रूप में किया जा सकता है। वैकल्पिक रूप से यह एक सीआरयूडी विधि के भीतर एक डेटाबेस कनेक्शन के साथ एक प्रति सत्र सेवा हो सकती है और बंद हो सकती है।

मेरे लिए यह कोई अलग संसाधन बुद्धिमान है और यह के रूप में ग्राहक आश्वासन दिया जा सकता प्रोग्रामिंग मॉडल सरल बनाता है कि वे हमेशा अपने प्रॉक्सी के लिए एक ही सर्वर वस्तु है: किसी भी में महंगी राज्य वहाँ कॉल के बीच हो सकता है कि बनाए रखा है और यह निर्धारित करने के तरीकों पर किसी भी अतिरिक्त पैरामीटर की आवश्यकता नहीं है कि सेवा द्वारा डेटा को पुनर्प्राप्त किया जाना चाहिए जब यह एक नई सर्वर ऑब्जेक्ट को फिर से चालू कर रहा है (जैसा कि प्रति-कॉल के मामले में)। यह कक्षाओं और वस्तुओं का उपयोग करने जैसा है, जहां वही संसाधन प्रबंधन समस्याएं लागू होती हैं, लेकिन हम किसी ऑब्जेक्ट पर मौजूद प्रत्येक विधि कॉल के लिए नए ऑब्जेक्ट उदाहरण नहीं बनाते हैं!

तो मुझे प्रति-कॉल मॉडल के साथ क्या याद आ रही है?

धन्यवाद

उत्तर

10

कोई सही है या PerCall या PerSession सिर्फ अलग शक्तियों और कमजोरियों के मामले में गलत है। आप ऑब्जेक्ट ओरिएंटेड पॉइंट ऑफ व्यू से आ रहे हैं जहां पेर्सेशन एक प्राकृतिक फिट है। एक सामान्य एसओए दृष्टिकोण एक PerCall दृष्टिकोण होगा।

सभी चीजें बराबर होती हैं, व्यापार-बंद प्रदर्शन बनाम स्केलेबिलिटी है। पर्सेशन बेहतर प्रदर्शन करना चाहिए क्योंकि ऑब्जेक्ट को बाद के अनुरोधों पर तत्काल नहीं होना चाहिए। PerCall को बेहतर स्केल करना चाहिए क्योंकि सर्वर पर तत्काल ऑब्जेक्ट्स केवल वास्तविक कार्य कर रहे हैं। यह सिर्फ "महंगी" संसाधन नहीं है, यह सर्वर पर खुले सभी सत्र हैं। जैसे एक पर्सेशन स्थिति में आपके पास सर्वर पर 1000 ऑब्जेक्ट्स तत्काल हो सकते हैं लेकिन वास्तव में केवल 100 ही किसी भी समय कॉल में कॉल कर रहे हैं। हालांकि, एक PerCall स्थिति में, 100 कॉल के लिए केवल 100 ऑब्जेक्ट्स तत्काल होंगे। तत्काल पर्सेशन ऑब्जेक्ट संसाधनों का अपशिष्ट हो सकता है और लोड के तहत अनुरोधों को पूरा करने की क्षमता को प्रभावित कर सकता है।

तो मेरी सेवा सार्वजनिक रूप से अवगत कराया गया था, मैं भी सेवा उपभोक्ताओं की सनक के लिए मेरी वस्तु जीवन काल पर भरोसा नहीं करना चाहते हैं; मैं दुर्भावनापूर्ण या छोटी गाड़ी कोड द्वारा मेरी सेवा को कम करने की संभावना के बारे में चिंता करूंगा।

पर्कॉल दृष्टिकोण का एक और संभावित लाभ सिस्टम उपलब्धता है। पिछले उदाहरण पर वापस जाकर, यदि कोई पर्सेशन सर्वर क्रैश हो रहा था तो उस सर्वर पर सत्र रखने वाले सभी 1000 क्लाइंट अपना सत्र खो देंगे और अपना काम पूरा करने में असमर्थ होंगे। PerCall स्थिति में केवल एक ही त्रुटि होगी जो 100 वास्तविक अनुरोधों के लिए होगी जो प्रगति पर थे (तेजी से विफलता मानते हैं)। अन्य 900 ग्राहकों को उनके अगले कॉल पर दूसरे सर्वर पर भेजा जा सकता है। एसएलए के लिए यह महत्वपूर्ण हो सकता है।

6

संक्षेप में जवाब राज्यविहीन और scalability हो जाएगा।

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

डिजाइन की अवधि में, यह भी सेवा कॉल एक दूसरे से स्वतंत्र बनाने के लिए अच्छा अभ्यास है। तो आप ऑब्जेक्ट की स्थिति को सेट करने के लिए पिछली सेवा कॉल पर भरोसा नहीं करते हैं।

+0

मैं लोड संतुलन और रूटिंग बारे में ज्यादा पता नहीं है, लेकिन नहीं जानते हुए भी कैसे अपने ग्राहकों को अपनी प्रोक्सी का उपयोग कर के मामले में, मेरी एक ही तर्क लागू होता है: कोड अपने सर्वर महंगा संसाधनों पर ऐसा है तो यह शामिल नहीं है धारण करने के लिए नहीं वस्तुओं इससे कोई फर्क नहीं पड़ता कि क्लाइंट प्रॉक्सी बंद नहीं करता है। यह भी, मैं क्या Juval Lowys WCF किताब में पढ़ा है के साथ बाधाओं जहां यह कहा गया है "अगर एक प्रति कॉल सेवा सही मायने में राज्यविहीन थे पर हो रहा है। पहली जगह में प्रति कॉल की कोई जरूरत नहीं होगी यह है क्योंकि सेवा ने कहा है कि आपको प्रति-कॉल मोड की आवश्यकता है। " भार संतुलन/रूटिंग के अलावा, मुझे अभी भी कोई अंतर नहीं दिख रहा है। – MrLane

+0

भेदभाव स्केलेबिलिटी पर अधिक खड़ा है, लेकिन यदि वे विचार नहीं हैं तो मैं उपरोक्त आपकी टिप्पणी से सहमत हूं। एक भारी बोझ के सर्वर पर, आपकी सेवा विभिन्न ग्राहकों से 5 मिनट में 10k बार कहा जाता है सत्र विन्यास प्रति में, कहते हैं, मेजबान इस 10k सत्र वस्तु जीवित है और उनके पट्टा राज्य के लिए पूलिंग रखने के लिए की आवश्यकता होगी। यह स्पष्ट रूप से सर्वर की स्मृति और प्रदर्शन पर ओवरहेड होगा। –

संबंधित मुद्दे