2010-08-10 15 views
7

मेरे पास तीन अलग-अलग मशीनों में एक डब्ल्यूसीएफ सेवा भार संतुलित है।डब्ल्यूसीएफ सेवाओं में अनुरोधों की थ्रॉटल संख्या

चलो कहते हैं कि इन सेवाओं के प्रकार एक, बी, और सी के अनुरोध को संसाधित कर सकते हैं। या बी को संसाधित करने की कोई सीमा नहीं है। हालांकि, हम एक समय में केवल सी के 5 अनुरोधों को संसाधित कर सकते हैं, इसलिए यदि सी प्रकार का 6 वां अनुरोध आता है, तो उसे पिछले अनुरोधों में से एक तक पूरा होने तक प्रतीक्षा करनी होगी।

मैं कैसे सुनिश्चित कर सकता हूं कि सी के केवल 5 अनुरोधों को सभी तीन मशीनों में संसाधित किया जा रहा है?

उत्तर

8

लगता है जैसे आपको एक क्रॉस-मशीन सेमफोर की आवश्यकता है, आप एक वितरित कैशिंग समाधान जैसे memcached का उपयोग कर कार्यान्वित कर सकते हैं। वैकल्पिक रूप से आपके पास एक और मशीन पर चलने वाली एक और डब्ल्यूसीएफ सेवा हो सकती है जो आपके भार संतुलित सेवाओं के लिए सेमफोर का प्रबंधन करती है।

तो नई सेवा कुछ इस तरह दिख सकता है:

[ServiceContract] 
public interface ISemaphorService 
{ 
    [OperationContract] 
    void Acquire(); 

    [OperationContract]  
    void Release(); 
} 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
public class SemaphoreService 
{ 
    private readonly static Semaphore Pool = new Semaphore(5, 5); 

    public void Acquire() 
    { 
     Pool.WaitOne(); 
    } 
    public void Release() 
    { 
     Pool.Release(); 
    } 
} 

एक असली दुनिया ऐप्लिकेशन में आप एक config या कुछ में विन्यास सेमाफोर की संख्या के लिए चाहते हो सकता है और कुछ समय समाप्ति में डाल दिया और तंत्र में डाल यह सुनिश्चित करने के लिए कि समय-समय पर सैमफोर जारी किए जाते हैं और/या जब क्लाइंट क्रैश हो जाता है:

// on the client side (service C) 
var client = new SemaphoreServiceClient(); 

try 
{ 
    // acquire the semaphore before processing the request 
    client.Acquire(); 

    // process request 
    ... 
} 
finally 
{ 
    // always remember the release the semaphore 
    client.Release(); 
} 
+2

ध्यान दें कि यह विफलता का एक बिंदु पेश करेगा। –

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