2012-04-16 23 views
12

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

वेब एपीआई की मेरी समझ यह है कि इसमें कार्यों पर परिचालन करके निर्मित एक असीमित व्यवहार है, और नतीजतन अनुरोधों की संख्या सीधे भौतिक धागे की संख्या से संबंधित नहीं होगी।

सेवा के नए कार्यान्वयन में मैं अनुरोधों को कैश तैयार होने तक प्रतीक्षा करने की योजना बना रहा हूं और फिर एक वैध उत्तर देता हूं। मैं वर्णन करने के लिए कोड का एक बहुत ही किसी न किसी स्केच बना दिया है:

public class ContactsController : ApiController 
{ 
    private readonly IContactRepository _contactRepository; 

    public ContactsController(IContactRepository contactRepository) 
    { 
     if (contactRepository == null) 
      throw new ArgumentNullException("contactRepository"); 
     _contactRepository = contactRepository; 
    } 

    public IEnumerable<Contact> Get() 
    { 
     return _contactRepository.Get(); 
    } 
} 

public class ContactRepository : IContactRepository 
{ 
    private readonly Lazy<IEnumerable<Contact>> _contactsLazy; 

    public ContactRepository() 
    { 
     _contactsLazy = new Lazy<IEnumerable<Contact>>(LoadFromDatabase, 
      LazyThreadSafetyMode.ExecutionAndPublication); 
    } 

    public IEnumerable<Contact> Get() 
    { 
     return _contactsLazy.Value; 
    } 

    private IEnumerable<Contact> LoadFromDatabase() 
    { 
     // This method could be take a long time to execute. 
     throw new NotImplementedException(); 
    } 
} 

कृपया कोड के डिजाइन में बहुत अधिक मूल्य न रखें - यह केवल समस्या को वर्णन करने का निर्माण किया और हम इसे कैसे में किया था नहीं है वास्तविक समाधान आईसीओटीएक्ट रिपोजिटरी आईओसी कंटेनर में सिंगलटन के रूप में पंजीकृत है और इसे नियंत्रक में इंजेक्शन दिया जाता है। LazyThreadSafetyMode.AxecutionAndPublication के साथ आलसी केवल पहला धागा/अनुरोध प्रारंभिक कोड चला रहा है, प्रारंभिकता पूर्ण होने तक निम्नलिखित rquests अवरुद्ध कर रहे हैं।

क्या वेब एपीआई 1000 अनुरोधों को पूरा करने में सक्षम हो जाएगा, प्रारंभिक होने के लिए प्रतीक्षा कर रहा है, जबकि अन्य अनुरोध इस आलसी को मारने से नहीं हैं और आईआईएस कार्यकर्ता धागे से बाहर नहीं चल रहे हैं?

उत्तर

10

कार्रवाई से Task<T> लौटने से कोड पृष्ठभूमि थ्रेड (थ्रेडपूल) पर चलने की अनुमति देगा और आईआईएस थ्रेड जारी करेगा। तो इस मामले में, मैं

public Task<IEnumerable<Contact>> Get() 

को

public IEnumerable<Contact> Get() 

बदल जाएगा एक कार्य शुरू कर दिया अन्यथा धागा सिर्फ बैठने के लिए और कोई कार्य नहीं करेगा वापस जाने के लिए याद रखें।

उपयोगी हो सकता है, जबकि आलसी कार्यान्वयन वेब एपीआई के व्यवहार से कम नहीं किया गया है। तो मैं उस पर टिप्पणी नहीं कर रहा हूँ। आलसी के साथ या बिना, कार्य आधारित रिटर्न प्रकार लंबे समय तक चलने वाले संचालन के लिए जाने का तरीका है।

मुझे इस पर दो ब्लॉग पोस्ट हैं जो शायद आपके लिए उपयोगी हैं: here और here

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