2010-08-10 10 views
7

Ich habe eine Last WCF-Dienst auf drei verschiedenen Maschinen ausgeglichen.Drosselklappen Anzahl der Anfragen über WCF-Dienste

Lasst uns diese Dienste A, B und C Anfragen von Typen verarbeiten sagen kann. Es gibt keine Grenzen gesetzt Verarbeitung A oder B. Allerdings können wir nur bearbeiten, 5 Anfragen vom Typ C zu einer Zeit, so dass, wenn eine sechste Anforderung vom Typ C kommt, wird es warten müssen, bis einer der vorherigen Anfragen beenden.

Wie kann ich sicherstellen, dass nur 5 Anfragen vom Typ C über alle drei Maschinen bearbeitet werden?

Antwort

8

Klingt wie Sie eine Quer Maschine Semaphore benötigen, können Sie eine mit einer verteilten Caching-Lösung wie Memcached implementieren können. Alternativ können Sie einen anderen WCF-Dienst auf einem einzelnen Computer ausführen, der den Semaphor für Ihre Lastenausgleichsdienste verwaltet.

So der neue Dienst könnte wie folgt aussehen:

[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(); 
    } 
} 

In einer realen Welt app Sie vielleicht die Anzahl der Semaphore konfigurierbar in einer Config oder etwas und legte in einigen Timeouts haben und Mechanismus setzt in um sicherzustellen, dass Semaphore rechtzeitig freigegeben werden und/oder wenn der Client abstürzt:

// 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

Beachten Sie, dass es einen einzelnen Fehlerpunkt einführt. –

Verwandte Themen