2012-07-03 29 views
13

मेरे पास netNamedPipeBinding बाध्यकारी के साथ कंसोल में स्वयं-होस्टेड डब्ल्यूसीएफ सेवा है। सेवा सिर्फ एक खाली विधि है Send(DataTable bulk)डब्ल्यूसीएफ क्यूई सेवा से एमएसएमक्यू तेज क्यों है?

[ServiceContract] 
public interface IWcfQueueService 
{ 
    [OperationContract] 
    void Send(DataTable bulk);  
} 
public class WcfQueueService : IWcfQueueService 
{ 
    public void Send(DataTable bulk) 
    {   
     // Here would be something like _bulks.Add(bulk); 
     // BUT, for now it is empty method and still it's slower than MSMQ 
    }  
} 

मेरे क्लाइंट डीबी से 200K आदानों हो जाता है और हमारे BoundedThreadPool साथ इसे संसाधित (केवल बनाता है, चलो कहते हैं, 20 धागे)। प्रत्येक इनपुट को विभिन्न धागे से संसाधित किया जाता है। प्रत्येक थ्रेड MyMethod निष्पादित करता है और MyMethod के अंत में परिणाम bulkManager में जोड़ा जाता है।

public void MyMethod(string input) 
{    
    var res = ProcessInput(input); 
    bulkManager.Add(res); 
} 

जब bulkManager जम एन आइटम (= थोक) यह थोक एक और धागा सब यह होता है दो तरीकों में से एक के साथ कि थोक को कतारबद्ध है कि करने के लिए पारित:

  1. तो WCF सक्षम: wcfQueueService.Send(bulk);
  2. किसी और अगर MSMQ सक्षम: new MessageQueue(@".\private$\q").Send(new Message {Body = bulk});

सभी दो तरीकों से काम करता है, लेकिन MSMQ और अधिक तेजी से काम करता है। एमएसएमक्यू क्लाइंट 20 सेकेंड में लगभग 80 के थोक को संसाधित करने का प्रबंधन करता है जबकि डब्ल्यूसीएफ केवल 20 के -30 के थोक के साथ होता है। मुझे समझ में नहीं आता कि ऐसा क्यों होता है। एमएसएमक्यू जैसी विभिन्न प्रक्रियाओं में मेरा डब्ल्यूसीएफ चलता है। इसके अलावा, मेरा डब्ल्यूसीएफ कुछ भी स्टोर नहीं करता है, इसमें खाली विधि है। तो एमएसएमक्यू ने डब्ल्यूसीएफ क्यों जीता?

अपडेट किया गया leppie के रूप में सुझाव दिया मैं .NetRemoting की कोशिश की। NetRemoting वास्तव में गति में सुधार हुआ। ग्राहक 60K संसाधित किया। लेकिन,

  1. यह मैंने पढ़ा है के रूप में नेट दूरस्थ WCF द्वारा हटा दिया गया है और WCF this के अनुसार नेट दूरस्थ तुलना में तेजी से होना चाहिए, तो क्यों मुझे लगता है कि मेरी WCF धीमी है पाने के लिए अभी भी MSMQ
  2. की तुलना में धीमी है? शायद मेरा बाध्यकारी गलत है?
+0

आपको शायद एमएसएमक्यू (नामित पाइप दिए गए, मैं स्थानीय मशीन पर आईपीसी मानता हूं) से बहुत तेज़ रिमोटिंग मिल जाएगा। – leppie

+0

@leppie, नेट रीमोटिंग ने वास्तव में गति में सुधार किया। ग्राहक 60K संसाधित किया। लेकिन, 1 - यह अभी भी एमएसएमक्यू की तुलना में धीमी है और 2- जैसा कि मैंने पढ़ा है। डब्ल्यूसीएफ द्वारा डॉट रीमोटिंग को हटा दिया गया है और डब्ल्यूसीएफ को http://msdn.microsoft.com/en-us/library/bb310550 के अनुसार नेट रीमोटिंग से तेज होना चाहिए। .aspx # wcfperform_topic3d, तो मुझे क्यों लगता है कि मेरा डब्ल्यूसीएफ धीमा है? – theateist

+0

@theateist: क्या आप सेवा पर 'सिंगल' और 'ConcurrencyMode'' को 'एकाधिक' में अपना 'InstanceContextMode' बदल सकते हैं? फिर एक और परीक्षण करें। थ्रॉटलिंग सेटिंग्स को समायोजित करने का प्रयास करें (सेवा व्यवहार में)। –

उत्तर

4

आप इस तरह की तुलना नहीं कर रहे हैं।

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

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

इसके अलावा, आपके बाध्यकारी को कॉन्फ़िगर करने के तरीके के आधार पर, अन्य महत्वपूर्ण अंतर हो सकते हैं, उदाहरण के लिए सुरक्षा। वैसे, क्या आपने वास्तव में NetMsmq बाइंडिंग के बजाय NetNamedPipeBinding (जैसा कि आपका प्रश्न बताता है) का उपयोग किया था क्योंकि शीर्षक का मतलब था? यदि ऐसा है, तो डिफ़ॉल्ट बाध्यकारी कॉन्फ़िगरेशन का उपयोग करके आपके पास totally unnecessary एन्क्रिप्शन और प्रत्येक थोक संदेश पर हस्ताक्षर करने पर हस्ताक्षर होगा, जो आपके प्रत्यक्ष एमएसएमक्यू मामले में नहीं हो रहा है। बड़े संदेशों पर ये क्रिप्टोग्राफिक ऑपरेशंस अपेक्षाकृत महंगी भी होंगे।

एक बेहतर तुलना डब्ल्यूसीएफ ऑपरेशन के साथ वनवे के रूप में परिभाषित की जाएगी।

+0

कि 'पूरी तरह से अनावश्यक' लिंक मर चुका है, किसी भी मौके पर आपके पास प्रवेश की एक प्रति है? वास्तव में इसे पढ़ने में रुचि रखते हैं, धन्यवाद – zaitsman

0

मुझे लगता है कि अंतर आपके डब्ल्यूसीएफ ऑपरेशन बनाम में क्या होता है जब एमएसएमक्यू अनुरोध करता है तो क्या करता है।

मुझे उम्मीद है कि जब आप एमएसएमक्यू के साथ एक संदेश को स्वीकार करते हैं तो निष्पादित विधि सरल संदेश को स्वीकार करती है और कुछ भी नहीं। कुछ बैक-एंड वर्कर भारी भारोत्तोलन करते हैं।

अपने ऑपरेशन में, आपको अनुरोध हैंडलर के सिंगलटन इंस्टेंस को अनुरोध पास करने की आवश्यकता है। जब अनुरोध "स्पून अप" होता है तो अनुरोध हैंडलर इंस्टेंस को तुरंत चालू किया जाना चाहिए।

आप अपने अनुरोधों को समानांतर करने के लिए .NET 4 में कार्य समांतर लाइब्रेरी का उपयोग कर बेहतर प्रदर्शन भी पा सकते हैं।

1

क्या आप उदाहरण कोड प्रदान कर सकते हैं जो आपके द्वारा देखे जा रहे व्यवहार को दिखाता है?

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

सीधा एमएसएमक्यू के साथ 20,000 CPU समय के 64.75 प्रतिशत और डब्ल्यूसीएफ संस्करण 20,000 संदेश भेजते हुए CPU समय के 34.16 प्रतिशत (विज़ुअल स्टूडियो अल्टीमेट की विश्लेषण सुविधा का उपयोग करके यंत्र) का उपयोग करते थे।

जब तक मैंने अपने अंत में कोई त्रुटि नहीं की है, डब्ल्यूसीएफ संस्करण हार्ड कोडित एमएसएमक्यू समकक्ष के रूप में लगभग दोगुना तेज़ था।