2010-01-22 18 views
10

मैं डब्ल्यूसीएफ सेवाओं के लिए नया हूं और सोच रहा हूं कि निम्नलिखित से निपटने का सबसे अच्छा तरीका क्या होगा।कई समवर्ती ग्राहकों और डेटाबेस पहुंच के लिए डब्ल्यूसीएफ सेवा

मेरे पास कई ग्राहक हैं (~ 200 - ~ 500) जो सभी कामकाजी दिन के दौरान लगातार मेरी सेवा के अनुरोध कर रहे हैं। अधिकांश अनुरोधों में सही प्रतिक्रिया को वापस लाने के लिए अंतर्निहित डेटाबेस की पूछताछ शामिल होती है।

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

क्या डब्ल्यूसीएफ सेवा के समवर्ती कनेक्शन की संख्या को सीमित करना बेहतर होगा और इसलिए अनजाने में डेटाबेस कनेक्शन की संभावित संख्या को कम करना बेहतर होगा?

मैंने सेवा को एक सिंगलटन बनाने के लिए देखा है जो थ्रेड को डेटाबेस लेनदेन करने के लिए प्रेरित करता है, इसलिए मैं धागे की संख्या को नियंत्रित कर सकता हूं लेकिन यह ओवरकिल है और सेवा को पर्याप्त रूप से कनेक्शन को सीमित कर देगा?

किसी भी सलाह के लिए बहुत धन्यवाद।

उत्तर

13

मार्कोस पहले से ही उल्लेख किया है - WCF एक अंतर्निहित में सेवा थ्रॉटलिंग क्षमता है, जो आपको सर्वर पर परिवर्तित कर सकते हैं। यह रोकता है कि आपके डेटाबेस सर्वर को कई बार अनुरोधों में बाढ़ आ जाएगी।

चूक कर रहे हैं:

<serviceThrottling 
     maxConcurrentCalls="16" 
     maxConcurrentSessions="10" 
     maxConcurrentInstances="26" /> 

अधिक जानकारी के लिए MSDN docs on ServiceThrottlingBehavior देखें।

इसका मतलब है कि अधिकतम 16 कॉल डब्ल्यूसीएफ द्वारा समवर्ती रूप से संभाले जाते हैं - यानी आईएफ आपकी डब्ल्यूसीएफ सेवा कक्षा कई कॉलर्स को एक बार में अनुमति देती है!

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

यदि आप अपनी डब्ल्यूसीएफ सेवा कक्षा को सिंगलटन बनाते हैं, तो आपको या तो अपने कंसुरेंसीमोड को एकाधिक में सेट करना होगा - लेकिन फिर आपको अत्यधिक सावधानी बरतनी होगी कि आपकी कक्षा में दो एक साथ थ्रेड एक ही मूल्य को एक दूसरे के नीचे से न बदल दें; बहु थ्रेडिंग सुरक्षित प्रोग्रामिंग एक बड़ी चुनौती है! या आप समेकन मोड को एकाधिक पर सेट नहीं करते हैं, लेकिन फिर आपका एकमात्र डब्ल्यूसीएफ सेवा वर्ग उदाहरण केवल एक धारावाहिक फैशन में अनुरोधों को संभाल सकता है, एक समय में - बहुत स्केलेबल नहीं!

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

और भी विस्तार के लिए Dan Rigsby's excellent blog post on WCF service throttling देखें।

+1

धन्यवाद मार्क। रुबेंस की पोस्ट और आपके साथ मुझे विश्वास है कि मैं डेटाबेस को अधिभारित नहीं करूँगा और उस सम्मान में अंतिम उपयोगकर्ताओं को अधिक नियंत्रण प्रदान कर सकता हूं। – Andy

4

यदि आप अपने डेटाबेस से कनेक्ट करने के लिए एडीओ का उपयोग कर रहे हैं, तो इसे कनेक्शन पूलिंग तंत्र प्रदान करना चाहिए, इसलिए आपको इससे निपटने की आवश्यकता नहीं है।

कृपया अधिक जानकारी के लिए यह लेख पढ़ें: ADO.NET Connection Pooling at a Glance

+1

धन्यवाद रूबन्स, मैं अपनी कनेक्शन सेटिंग्स कॉन्फ़िगर करूँगा और तनाव मेरी सेवा का परीक्षण करूंगा। – Andy

+0

हैलो @ एंडी, मैंने यहां सभी पोस्ट देखी और वास्तव में मेरे लिए बहुत उपयोगी थी। क्या आप कृपया बता सकते हैं कि सेवा पर तनाव परीक्षण कैसे करें? क्या कोई सॉफ्टवेयर है? –

3

हम एक समान परिदृश्य है और हम इसे डीबी के लिए हमारी WebService से केवल एक ही कनेक्शन के टूटने का उपयोग करने और SqlServer कि पूरी तरह से और बहुत तेजी से काम करता है से मंगल ग्रह का उपयोग कर हल। एसक्यूएल सर्वर वास्तव में समवर्ती प्रश्नों को संभालने के बारे में जानता है जो आपको उसमें नहीं सोचना चाहिए।

आप उस के साथ खुला की भूमि के ऊपर से बचने और कनेक्शन (obviosly कि कनेक्शन पूलिंग इस मामले में मदद करता है) बंद

की तरह अपने वेब सेवा कुछ में जोड़ने के लिए भी याद रखें:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, 
     ConcurrencyMode = ConcurrencyMode.Multiple)] 

और में config:

<serviceThrottling maxConcurrentCalls="100" 
maxConcurrentSessions="100" 
maxConcurrentInstances="100" /> 

यह विकल्प

के अंदर है

आशा इस मदद करता है :)

+1

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

+0

हमारे लिए सिंगलटन सही है, अगर आपके कोड में कोई लॉक नहीं है तो उसे उसी ऑब्जेक्ट पर चलाने की समस्या क्या है? असल में हम प्रत्येक कॉल पर सेवा ऑब्जेक्ट सृजन से बचते हैं और तनाव परीक्षण में हम सिंगलटन के साथ बेहतर प्रदर्शन करते हैं। हमारी सेवा केवल डीबी पर चयन क्वेरी करती है, हम किसी परिदृश्य को नहीं देखते हैं जहां सिंगलटन हमें समस्याएं देता है। आपके समाधान के साथ केवल 16 प्रश्न या 10 एक ही समय में संभाले जाएंगे, एसक्यूएल सर्वर को 100 या उससे अधिक संभालने की समस्या क्या है?, क्वेरी से बचने के लिए वास्तव में महंगा होना चाहिए। – MarcosMeli

+1

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

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