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();
}
Tenga en cuenta que introducirá un único punto de falla. –