2012-05-31 3 views

ответ

8

Я думаю, вы неправильно поняли, что такое рабочая роль. Роли Web и рабочих являются виртуальными машинами Windows Server, основное отличие которых заключается в том, что в роли веб-роли работает IIS. У вас может быть несколько экземпляров каждого.

В самом деле нет такой вещи, как «множественные роли работников в одном экземпляре». Подумайте о роли рабочего в качестве шаблона для вашей виртуальной машины: сценарии запуска и код обработки событий для обработки таких сообщений, как запуск и завершение работы, а также код, который вы пишете, который упаковывается и запускается внутри виртуальной машины.

С OnStart() или Run() вы можете запускать практически любой код, который вы хотите. Удалите несколько потоков, запустите код сервера (например, Tomcat) и т. Д. Независимо от того, какой код у вас будет запущен в каждом экземпляре. По мере того как вы масштабируетесь до нескольких экземпляров, этот же шаблон виртуальной машины используется для каждого из этих экземпляров.

См. Также this answer, где я расскажу немного подробнее.

5

Как Давид, упомянутый в его ответе, вы можете запускать несколько потоков. Один из моих клиентов сделал это, используя класс ThreadedRoleEntryPoint.

Этот класс позволяет использовать несколько классов точек входа работника роль (даже из нескольких сборок) и запускать их в одной и той же роли:

public override void Run() 
    { 
     Trace.TraceInformation("WebRole::Run begin", "Information"); 

     List<WorkerEntryPoint> workers = new List<WorkerEntryPoint>(); 

     workers.Add(new Worker1()); 
     workers.Add(new Worker2()); 

     base.Run(workers.ToArray()); 

     Trace.TraceInformation("WebRole::Run end", "Information"); 
    } 

Преимущество здесь в том, что вы могли бы начать с малого и работать весь рабочий роли (а не рабочие роли, но назовем их процессами или рабочими) в одной роли (которую вы фактически развертываете).

Затем, когда ваш бизнес начнет расти, вы можете начать использовать выделенные роли, что означает, что на роль рабочего будет выполняться как минимум 1 экземпляр. И когда это должно произойти, влияние на ваш код будет минимальным, поскольку рабочие передали ThreadedRoleEntryPoint наследовать из WorkerEntryPoint, который очень похож на класс RoleEntryPoint.

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