Количество дросселя запросов через сервисы WCF

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

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

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

7
задан Foobar 10 August 2010 в 22:45
поделиться

1 ответ

Похоже, вам нужен межмашинный семафор, вы можете реализовать его, используя решение для распределенного кэширования, такое как 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();
}
8
ответ дан 7 December 2019 в 05:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: