Отрегулируйте количество запросов через службы WCF - PullRequest
7 голосов
/ 11 августа 2010

У меня сервисная нагрузка WCF сбалансирована на трех разных машинах.

Допустим, эти службы могут обрабатывать запросы типов A , B и C .Нет ограничений на обработку A или B .Тем не менее, мы можем обрабатывать только 5 запросов типа C одновременно, поэтому, если поступит 6-й запрос типа C , придется подождать, пока один из предыдущих запросовКонец.

Как я могу убедиться, что только 5 запросов типа C обрабатываются на всех трех машинах?

1 Ответ

8 голосов
/ 11 августа 2010

Звучит так, будто вам нужен межмашинный семафор, вы можете реализовать его с помощью решения распределенного кэширования, такого как 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();
}
...