Мне сбалансировали рабочую нагрузку WCF через три различных машины.
Скажем, эти сервисы могут обработать запросы типов A, B, и C. Нет никаких пределов обработке A или B. Однако мы можем только обработать 5 запросов типа C за один раз, поэтому если 6-й запрос типа C входит, он должен будет ожидать до одного из предыдущего конца запросов.
Как я могу удостовериться, что только 5 запросов типа C обрабатываются через все три машины?
Похоже, вам нужен межмашинный семафор, вы можете реализовать его, используя решение для распределенного кэширования, такое как memcached. В качестве альтернативы у вас может быть другая служба WCF, работающая на одном компьютере, которая управляет семафором для ваших служб с балансировкой нагрузки.
Таким образом, новая служба может выглядеть примерно так:
[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();
}
}
В реальном приложении вы можете захотеть иметь количество семафоров, настраиваемое в конфигурации или что-то в этом роде, и установить несколько таймаутов и включить механизм, чтобы убедиться, что семафоры выпущен своевременно и / или при сбое клиента:
// 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();
}