2010-08-10 11 views
7

Tengo una carga de servicio WCF equilibrada en tres máquinas diferentes.Número de aceleración de solicitudes en los servicios de WCF

Digamos que estos servicios se pueden procesar las solicitudes de tipos Un, B, y C. No hay límites para procesar A o B. Sin embargo, solo podemos procesar 5 solicitudes del tipo C a la vez, por lo que si se produce una 6ª solicitud del tipo C, tendrá que esperar hasta que finalice una de las solicitudes anteriores.

¿Cómo puedo asegurarme de que solo se procesan 5 solicitudes del tipo C en las tres máquinas?

Respuesta

8

Parece que necesita un semáforo a través de la máquina, puede implementar uno utilizando una solución de caché distribuida como memcached. Alternativamente, podría tener otro servicio WCF ejecutándose en una sola máquina que administre el semáforo para sus servicios de carga equilibrada.

Así que el nuevo servicio podría ser algo como esto:

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

En una aplicación en el mundo real es posible que desee tener el número de semáforos configurables en una configuración o algo y poner en algunos tiempos de espera y poniendo en el mecanismo para asegurarse de que los semáforos se publiquen oportunamente y/o cuando el cliente falle:

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

Tenga en cuenta que introducirá un único punto de falla. –

Cuestiones relacionadas