c# - डब्ल्यूसीएफ सेवा अनुबंध इंटरफ़ेस के विभिन्न रूप



.net wcf (1)

ऐसा लगता है कि मैं ग्राहकों को तोड़ने के बिना, उसी डब्ल्यूसीएफ अनुबंध इंटरफ़ेस एपीआई के निम्नलिखित तीन अलग-अलग संस्करणों के बीच स्वतंत्र रूप से स्विच कर सकता हूं:

[ServiceContract]
interface IService
{
    // Either synchronous
    // [OperationContract]
    // int SomeMethod(int arg);

    // Or TAP
    [OperationContract]
    Task<int> SomeMethodAsync(int arg);

    // Or APM
    // [OperationContract(AsyncPattern = true)]
    // IAsyncResult BeginSomeMethod(int arg, AsyncCallback callback, object state);
    // int EndSomeMethod(IAsyncResult ar);
}

मौजूदा टेस्ट क्लाइंट ऐप बिना किसी रीकंपिलिंग या टचिंग के काम करता रहता है। यदि मैं सेवा को पुन: संकलित करता हूं और क्लाइंट ऐप में अपना संदर्भ दोबारा आयात करता हूं, तो डब्लूएसडीएल परिभाषा वही रहती है , 1: 1।

मेरे सवाल:

  • क्या यह एक कानूनी व्यवहार है जिस पर मैं भरोसा कर सकता हूं? क्या यह कहीं भी दस्तावेज है?

विचार है कि सिंक्रोनस SomeMethod -style विधियों के एक सेट को टीएपी SomeMethodAsync -style विधियों में SomeMethodAsync , ताकि उनके कार्यान्वयन में async/await का उपयोग किया जा सके और इस प्रकार मौजूदा ग्राहकों को तोड़ने के बिना डब्लूसीएफ सेवा स्केलेबिलिटी में सुधार किया जा सके।

इसके अलावा, .NET 3.5 और .NET 4.0 के तहत डब्ल्यूसीएफ सेवा स्केलिंग के साथ ज्ञात समस्याएं हैं। उन्हें एमएसकेबी लेख में दस्तावेज किया गया है "डब्ल्यूसीएफ सेवा धीरे-धीरे लोड के तहत बढ़ सकती है" और कोडप्रोजेक्ट आलेख " उच्च स्केलेबल एसिंक आरईएसटी एपीआई बनाने के लिए ट्वीकिंग डब्ल्यूसीएफ" । असल में, सेवा अनुबंध एपीआई को स्वाभाविक रूप से एसिंक्रोनस के रूप में लागू करने के लिए पर्याप्त नहीं था, डब्ल्यूसीएफ रनटाइम अभी भी अनुरोध थ्रेड को अवरुद्ध कर रहा था।

  • क्या किसी को पता है कि क्या यह समस्या .NET 4.5.x के लिए तय की गई है , आउट ऑफ़ द बॉक्स? या अतिरिक्त tweaks अभी भी आवश्यक हैं?

डब्ल्यूसीएफ संचालन को सिंक्रोनस, ईएपी या (.NET 4.5 के रूप में) टीएपी का उपयोग करके परिभाषित किया जा सकता है। MSDN :

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

आप वास्तव में एक ही अनुबंध इंटरफेस में सभी 3 पैटर्न कर सकते हैं, और वे सभी एक ही संदेश से संबंधित होंगे।

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

यदि आप OperationDescription SyncMethod को देखते हैं, जिसका उपयोग ContractDescription SyncMethod में किया जाता है, तो आप देखेंगे कि प्रत्येक ऑपरेशन में ये गुण हैं: SyncMethod , BeginMethod , EndMethod और TaskMethod । विवरण बनाते समय, डब्ल्यूसीएफ ऑपरेशन के नाम के अनुसार सभी विधियों को एक ही ऑपरेशन में जोड़ देगा। यदि अलग-अलग पैटर्न (जैसे विभिन्न पैरामीटर) में एक ही नाम के साथ संचालन के बीच कुछ मेल नहीं है तो डब्ल्यूसीएफ एक अपवाद फेंक देगा जो वास्तव में गलत है। डब्ल्यूसीएफ स्वचालित रूप से कार्य (वैकल्पिक) कार्य-आधारित विधियों के लिए "Async" प्रत्यय मानता है, और एपीएम के लिए प्रारंभ / समाप्ति उपसर्ग।

इस अर्थ में ग्राहक और सर्वर पक्ष पूरी तरह से असंबंधित हैं। उपयोगिता जो WSDL ( svcutil ) से प्रॉक्सी कक्षाएं उत्पन्न करती है, किसी निष्पादन पैटर्न के लिए प्रॉक्सी बना सकती है। यह एक डब्ल्यूसीएफ सेवा भी नहीं है।

सर्वर की तरफ, यदि एक से अधिक पैटर्न लागू किए गए हैं, तो डब्ल्यूसीएफ प्राथमिकता के निम्नलिखित क्रम में केवल एक का उपयोग करेगा: कार्य, सिंक और एपीएम। यह एमएसडीएन में कहीं भी दस्तावेज है, मैं अभी इसे अभी नहीं ढूंढ सकता। लेकिन आप here संदर्भ स्रोत देख सकते here

अंत में, जब तक आप ऑपरेशन का प्रतिनिधित्व करने वाले संदेश को संशोधित नहीं करते हैं, तब तक आप अपने सर्वर कार्यान्वयन को सुरक्षित रूप से बदल सकते हैं।

स्केलिंग के बारे में (एक अलग सवाल आईएमओ होना चाहिए)

  • डब्ल्यूसीएफ के थ्रॉटलिंग डिफ़ॉल्ट मानों को .NET 4.5 में अधिक उचित मानों में अपडेट किया गया है और अब प्रोसेसर-निर्भर हैं ( here देखें)।
  • थ्रेड-पूल मुद्दे के संबंध में कोई बदलाव नहीं है। समस्या पूर्णता पोर्ट थ्रेड-पूल के शुरुआती आकार से उत्पन्न होती है, जो प्रारंभ में लॉजिकल प्रोसेसर की मात्रा 4 गुना निर्धारित होती है। आप कुछ कारक द्वारा राशि बढ़ाने के लिए ThreadPool.SetMinThreads का उपयोग कर सकते हैं ( इस पोस्ट को देखें)। यह सेटिंग क्लाइंट साइड पर भी फायदेमंद हो सकती है।

यदि आप सर्वर पक्ष पर एसिंक का उपयोग करते हैं (अन्य सेवाओं, डेटाबेस इत्यादि को कॉल करते समय), थ्रेडिंग स्थिति नाटकीय रूप से बेहतर हो सकती है क्योंकि आप थ्रेड-पूल धागे को बर्बाद नहीं करेंगे जो सिर्फ आईओ को पूरा करने की प्रतीक्षा कर रहे हैं।

इन स्थितियों में सबसे अच्छी बात बेंचमार्किंग का एक बहुत कुछ करना है।





async-await