2009-11-18 10 views
21

मेरा मानना ​​है कि जिमी निल्सन ने कहा कि वह आम तौर पर अपने वेबसाइसेस सिंगलेट बनाते हैं। क्या यह पसंदीदा तरीका है, और डब्ल्यूसीएफ के साथ? सेवा विधियों को स्थिर बनाने के अलावा, क्या कुछ और किया जाना है?क्या डब्ल्यूसीएफ सेवा आम तौर पर सिंगलटन होनी चाहिए या नहीं?

+0

क्या आपके पास कोई लिंक है जहां किसी ने सिंगलेट का उपयोग करने के लिए कहा था? हो सकता है कि हम में से किसी के बारे में सोचने की तुलना में एक और अधिक आकर्षक कारण हो ... –

+0

यह अपनी पुस्तक "डोमेन-संचालित डिजाइन और पैटर्न लागू करना: सी # में उदाहरणों के साथ लागू करना" में था। – suedeuno

उत्तर

24

अच्छी प्रतिक्रियाएं, लेकिन मुझे लगता है कि मूल प्रश्न में कोई समस्या है। एक तकनीक का "विशिष्ट उपयोग" एक खराब गठित सवाल है। किसी के पास "सामान्य" परिदृश्य नहीं है, और कार्यान्वयन या दृष्टिकोण पर निर्णय लेने से पहले आपको अपनी विशेष समस्या की आवश्यकताओं की समीक्षा करनी चाहिए। आपकी आवश्यकताओं को आपके समाधान को सूचित करना चाहिए।

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

// we are specifying that this service implementation is single-threaded 
// and WCF should permit *at most* one call at a time. Any requests made 
// simultaneously/concurrently are queued. 
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)] 
public class SingleThreadedNonThreadSafeService : IService { ... } 

और

// we are specifying that this service implementation is multi-threaded 
// and [hopefully!] thread-safe. WCF should permit any number of threads, 
// or any number of simultaneous concurrent calls. 
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class MultiThreadedThreadSafeService : IService { ... } 

Xml टिप्पणियां ConcurrencyMode के लिए मूल रूप से ऊपर की तरह एक ही बात कहें।

यदि आप ऐसा नहीं उपभोक्ताओं के बीच व्यापार तर्क या स्मृति साझा करने की आवश्यकता है, तो करते नहीं एक सिंगलटन, "मॉडल" पुष्टि नहीं करता समस्या फिट का उपयोग करें। यह एक सौतेली बहन के पैर पर एक गिलास चप्पल को मजबूर करना है! और किसी को भी इसे देखना नहीं चाहिए।


इसके विपरीत, यदि कॉल के बीच कोई भी राज्य साझा नहीं किया गया है, तो प्रति-कॉल \ सत्र एक आवृत्ति होस्ट करें।

+0

मुझे लगता है कि प्रश्न मालिक की व्याख्या मिस गई थी। मैंने सोचा कि वह प्रॉक्सी क्लाइंट क्लाइंट इंस्टेंस के बारे में बात कर रहा था, न कि सेवा स्वयं। किसी भी परिदृश्य में डब्ल्यूसीएफ मेजबान को सिंगलटन बनाने का अर्थ नहीं होगा, यह डिज़ाइन द्वारा स्टेटलेस है। मेरा मानना ​​है कि वह जिस वास्तविक प्रश्न से पूछने की कोशिश कर रहा था वह था: क्या सेवा के उपभोक्ता द्वारा उपयोग किए जाने वाले डब्ल्यूसीएफ सेवा क्लाइंट इंस्टेंस को सिंगलटन होना चाहिए या नहीं? @suedeuno ??? – Seabizkit

19

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

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

एकमात्र वास्तविक परिदृश्य जहां सिंगलटन समझ में आ सकता है, यदि आपको केवल एक ही संसाधन में उपलब्ध भौतिक संसाधन द्वारा उपयोग/संभाला जाना है - यदि आपकी सिंगलटन सेवा क्रमबद्ध करती है और इस प्रकार एक संसाधन की सुरक्षा करती है, तो इसका उपयोग करने के लिए समझ में आता है।

अन्यथा - खुद को परेशानी छोड़ दो! :-)

+2

+1 मेरे कुछ सहकर्मियों ने इसे मुश्किल तरीके से पाया .... उत्पादन में। – kemiller2002

+0

यदि वह क्लाइंट को भेजने के लिए होस्टिंग पर्यावरण (विंडोज़ सेवा, कंसोलएप) में होस्टस्वाइस इंस्टेंस का उपयोग कर रहा है - सिंगलटन पैटर्न को कार्यान्वित करना आसान हो सकता है; अन्यथा भेजने के लिए उसे या तो क्लाइंट बनाने की आवश्यकता है, या एक इंस्टेंस प्रदाता के माध्यम से एक उदाहरण प्राप्त करें। - ग्राहक मार्ग उपयोगी हो सकता है लेकिन मुझे लगता है कि जो पहले से बनाया गया था उसका उपयोग अच्छी तरह से किया गया था। अब तक मुझे थ्रेडिंग मुद्दों का सामना नहीं हो रहा है .. और सेवा में मुझे जो प्रदर्शन चाहिए वह स्थिर है और स्थिर लगता है। – Stix

8

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

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

+0

हां, इसका उत्तर थोड़ी देर पहले दिया गया था, लेकिन क्या आप इस टिप्पणी पर विस्तार कर सकते हैं कि "प्रति कॉल सेवाएं लोड संतुलन के साथ भी बहुत अच्छी तरह से काम करती हैं"? – McArthey

+0

मुझे लगता है कि @McArthey क्या इंगित कर रहा था कि यदि आप 'प्रति कॉल' सेवाओं का उपयोग करते हैं, तो यह आपको 'राज्य' के बारे में चिंता किए बिना अपने 'कॉल' को एकाधिक सर्वरों में वितरित करने का मौका देता है। –

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