2013-12-09 3 views
0

Я работаю над проектом, который использует службу WCF как маршрутизатор/балансировщик нагрузки для нескольких «рабочих сервисов». В принципе, маршрутизатор будет отслеживать, сколько работ каждый рабочий сервис работает, и направит новые рабочие места на работников с наименьшей нагрузкой. Я хотел бы иметь возможность добавлять/удалять рабочие службы/серверы по мере необходимости и не хочу поддерживать статический список этих рабочих сервисов. Каждый раз, когда рабочий сервис добавляется или удаляется, ему необходимо «зарегистрировать» и «отменить регистрацию» с маршрутизатором.Как я могу зарегистрировать услугу WCF «PerCall» с помощью моего сервиса WCF router/load balancing?

This MSDN article кратко описывает, что мне нужно для достижения.

То, что я в настоящее время, является служба WCF, которая действует как маршрутизатор:

[ServiceContract] 
public interface IRouterService 
{ 
    [OperationContract] 
    bool RegisterWorker(WorkerService worker); 
    [OperationContract] 
    bool UnregisterWorker(WorkerService worker); 
} 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class RouterService : IRouterService 
{ 
    List<WorkerService> workers = new List<WorkerService>(); //keeps track of worker services 

    public bool RegisterWorker(WorkerService worker) 
    { 
     bool isSuccess = false; 
     if (workerService.IsValid() && !workers.Any(w => w.EndpointUri == worker.EndpointUri)) 
     { 
      workers.Add(worker); 
      isSuccess = true; 
     } 
     return isSuccess; 
    } 

    public bool UnregisterWorker(WorkerService worker) 
    { 
     bool isSuccess = false; 
     if (workers.contains(worker)) 
     { 
      workers.Remove(worker); 
      isSuccess = true; 
     } 
     return isSuccess; 
    } 
} 

Этот «маршрутизатор сервис» имеет открытые методы, что работник службы называют в Register() и Unregister() сами по мере необходимости. Проблема, с которой я сталкиваюсь, заключается в том, что я хотел бы, чтобы мои рабочие службы были InstanceContextMode.PerCall, что не позволяет мне просто вызвать службу регистрации маршрутизатора в конструкторе службы работника (поскольку конструктор будет вызван для каждого вызова службы , который не будет работать для меня). Я мог бы определить рабочие сервисы как InstanceContextMode.Single, но это означает, что мне нужно будет написать логику для обработки нескольких потоков (вместо того, чтобы просто полагаться на WCF, чтобы создавать или обрабатывать столько потоков, сколько необходимо, используя контекстный режим PerCall).

Мысли? Есть ли способ, который я могу вызвать метод маршрутизатора Register() только один раз, когда рабочий сервис сначала подключается к сети, или мне нужно использовать одноэлементный подход и обрабатывать потоки?

Сообщите мне, если что-то не имеет смысла, и я попытаюсь уточнить.

ответ

0

Основываясь на кратком обзоре вашего сценария, я думаю, вы, возможно, захотите дать некоторое представление о службе маршрутизации .Net.

Routing Service является общим посредником SOAP, который действует как маршрутизатор сообщений. Основной функцией службы маршрутизации является возможность маршрутизации сообщений на основе содержимого сообщений, что позволяет пересылать сообщение конечной точке клиента на основе значения внутри самого сообщения в заголовке или в теле сообщения. RoutingService реализован как служба Windows Communication Foundation (WCF) в пространстве имен System.ServiceModel.Routing.

Хотя это не касается непосредственно вашей проблемы, я могу с уверенностью сказать, что наша команда имела положительные результаты с помощью службы маршрутизации.

С уважением,

+0

Не позволяет ли служба маршрутизации только маршрутизировать сообщения на основе их содержимого? Хотя мне придется фильтровать/маршрутизировать на основе контента (получить правильное сообщение в нужном типе службы), то, что меня больше беспокоит сейчас, это возможность загрузить баланс, отправив сообщения одного типа одному из нескольких работники. –

+0

В следующей статье приведено хорошее представление о службе маршрутизации и балансировке нагрузки. В статье, в частности, говорится, что «в целом, это гораздо более приятная реализация RoundRobin, и ее можно легко распространить и на другие модели балансировки нагрузки. Она отличается тем, что она 1) довольно мала, 2) понятна (особенно по сравнению с другими реализациями) 3) потокобезопасность и 4) исполнение "http://blogs.msdn.com/b/routingrules/archive/2010/04/14/load-balancing-at-the-routing- service.aspx – Seymour

+0

Для справки, я закончил тем, что пошел с одноэлементным подходом.Служба маршрутизации может выполнять то, что мне нужно, но из всего, что я прочитал, это означает больше для фильтрации сообщений для разных типов сервисов, тогда как мне нужно это сделать, а также баланс нагрузки между переменным числом каждого типа услуги. –

Смежные вопросы