2010-09-07 15 views
13

मैं डब्ल्यूसीएफ और एसओए में नौसिखिया हूं। मैं बस इन पर शुरू कर रहा हूं, मेरे पास सैद्धांतिक संदेह है:डब्ल्यूसीएफ में Concurrency कैसे काम करता है?

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

इस बिंदु पर क्लाइंट ए के लिए निष्पादित तर्क के साथ क्या होता है? सेवा दोनों अनुरोधों को पूरा करने के लिए कैसे प्रबंधित करती है?

उत्तर

37

आपके प्रश्न का उत्तर बाध्यकारी पर निर्भर करता है जिसका आप उपयोग कर रहे हैं। इस व्यवहार को नियंत्रित करने वाली दो सेटिंग्स हैं: InstanceContextMode और ConcurrencyMode। इन दोनों सेटिंग्स को ServiceBehaviorAttribute में सेट किया गया है।

InstanceContextMode नियंत्रित करता है कि सेवा को तुरंत कैसे चालू किया जाता है। इसमें निम्नलिखित मान हैं:

  • परकॉल - प्रत्येक बार जब आप सेवा को कॉल करते हैं तो नया सेवा उदाहरण बनाया जाता है। यह बाइंडिंग पर उजागर सेवाओं के लिए डिफ़ॉल्ट व्यवहार है जो परिवहन सत्र, विश्वसनीय सत्र या सुरक्षा सत्र => BasicHttp बाइंडिंग, WebHttp बाइंडिंग का उपयोग नहीं करते हैं।

  • प्रति सत्र - प्रत्येक बार जब आप नई प्रॉक्सी इंस्टेंस से सेवा कॉल करते हैं तो नया सेवा उदाहरण बनाया जाता है। एक ही प्रॉक्सी से आने वाली किसी भी कॉल को उसी सेवा उदाहरण (उदाहरण पर सर्वर पर रहता है) द्वारा संभाला जाता है। डिफ़ॉल्ट रूप से बाद में कॉल 10 मिनट (प्राप्त टाइमआउट) के भीतर किया जाना चाहिए या सेवा उदाहरण जारी किया गया है। बाध्यकारी पर उजागर सेवाओं के लिए यह डिफ़ॉल्ट डिफ़ॉल्ट व्यवहार है जो परिवहन सत्र, विश्वसनीय क्षरण या सुरक्षा सत्र => WSHttp बाइंडिंग (डिफ़ॉल्ट सेटिंग सुरक्षा सत्र का उपयोग करता है), नेटटीसीपी बाइंडिंग, नेटनामयुक्त पाइप बाइंडिंग का उपयोग करता है।

  • एकल - सेवा का केवल एक उदाहरण मौजूद है और यह सभी कॉलों को संभालता है।यह सेवा उदाहरण तब बनाया जा सकता है जब होस्ट शुरू होता है या जब सेवा पहली बार कॉल की जाती है।

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

  • सिंगल - केवल एक थ्रेड सेवा उदाहरण तक पहुंच सकता है। यह डिफ़ॉल्ट व्यवहार है।

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

  • एकाधिक - एकाधिक थ्रेड सेवा उदाहरण तक पहुंच सकते हैं।

अब आप जानते हैं कि आवृत्ति का उपयोग कैसे किया जा सकता है। आइए कुछ संयोजनों पर एक नज़र डालें:

  • परकॉल इंस्टेंसिंग + एकल समरूपता - विशिष्ट स्टेटलेस परिदृश्य। एकाधिक समवर्ती कॉल की अनुमति है।

  • परकॉल इंस्टेंसिंग + एकाधिक समरूपता - समझ में नहीं आता है। यह अभी भी एकल concurrency की तरह व्यवहार करता है।

  • पर्सेशन इंस्टेंसिंग + सिंगल कॉन्सुरेंसी - एकाधिक समवर्ती कॉल की अनुमति है, लेकिन प्रत्येक प्रॉक्सी से केवल एक ही कॉल को संसाधित किया जा सकता है। अन्य कॉल कतारबद्ध हैं।

  • पर्सेशन इंस्टेंसिंग + एकाधिक समवर्ती - एकाधिक समवर्ती कॉल की अनुमति है। प्रत्येक प्रॉक्सी से कई कॉल एक ही समय में एक ही उदाहरण तक पहुंच सकते हैं। आपको सेवा उदाहरण में साझा फ़ील्ड तक पहुंच का मैन्युअल सिंक्रनाइज़ेशन करना होगा।

  • सिंगल इंस्टेंसिंग + सिंगल कॉन्सुरेंसी - समय पर केवल एक अनुरोध संसाधित किया जा सकता है। अन्य अनुरोध कतारबद्ध हैं (डिफ़ॉल्ट टाइमआउट 30s)।

  • सिंगल इंस्टेंसिंग + एकाधिक समवर्ती - एकाधिक समवर्ती कॉल की अनुमति है। सभी कॉल एक ही समय में एक ही उदाहरण तक पहुंचते हैं। आपको सेवा उदाहरण में साझा फ़ील्ड तक पहुंच का मैन्युअल सिंक्रनाइज़ेशन करना होगा।

+0

महान स्पष्टीकरण Ladislav के लिए बहुत बहुत धन्यवाद! – Sandeep

+0

[यह आलेख] (http://blogs.msdn.com/b/rickrain/archive/2009/06/15/wcf-instancing-concurrency-and-throttling-part-1.aspx) डिफ़ॉल्ट कहता है 'PerSession' :( –

+0

@ लद्दीस्लाव श्रीन्का - तो 'पर्सेशन इंस्टेंसिंग + सिंगल कॉन्सुरेंसी' के लिए - 1) इसका मतलब है कि दो अलग-अलग प्रॉक्सी समवर्ती कॉल कर सकते हैं, और सेवा उन्हें एक साथ संसाधित कर सकती है? 2) लेकिन एक प्रॉक्सी से कई कॉल एक समय में संसाधित की जाएंगी? – VoodooChild

0

अच्छी तरह से सेवा अलग थ्रेड में अनुरोध निष्पादित कर रही है।

तो वे एक ही समय में निष्पादित हो सकते हैं।

5

यह सेवा क्रियान्वयन विशेषता के ConcurrencyMode प्रॉपर्टी के मूल्य पर निर्भर करता है जो सेवा कार्यान्वयन पर लागू होता है। यदि ConcurrencyMode एकल है, तो क्लाइंट बी से कॉल क्लाइंट ए से कॉल को पूरा करने के लिए प्रतीक्षा करेगा; यदि ConcurrencyMode एकाधिक है, तो दोनों एक ही समय पर अलग-अलग धागे पर निष्पादित किए जाएंगे।

सेट नहीं होने पर एकल के लिए ConcurrencyMode चूक: http://msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.concurrencymode.aspx

तुम भी InstanceContextMode संपत्ति समझने के लिए उपयोगी है और कई ग्राहकों से कैसे अधिक अनुरोध को नियंत्रित मिल सकता है नियंत्रित किया जाता है: http://msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.instancecontextmode.aspx

+0

यह उत्तर सही नहीं है। आप जो वर्णन करते हैं वह InstanceContextMode.Single और ConcurrencyMode.Single का संयोजन है। यह डिफ़ॉल्ट व्यवहार नहीं है। –

1

आप संगामिति नियंत्रण कर सकते हैं ConcurrencyMode का उपयोग करके और InstanceContextMode के माध्यम से नए कनेक्शन कैसे प्रबंधित किए जाते हैं - यह Microsoft documentation है।

समवर्ती कनेक्शन की संख्या भी थ्रॉटल हो सकती है - अपने डब्ल्यूसीएफ कॉन्फ़िगरेशन में serviceThrottling तत्व देखें।

2

इंस्टेंसिंग और समवर्ती दोनों के लिए सेटिंग्स हैं, विवरण के लिए http://msdn.microsoft.com/en-us/library/ms731193.aspx देखें।

आईआईएस में अपनी डब्ल्यूसीएफ सेवा चलाने से कुछ समवर्ती मुद्दों का ख्याल रखा जाता है।

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