2010-02-04 2 views
1

У меня есть два экземпляра рабочей роли.Как выполнить подзадачу только на одном экземпляре роли рабочего лица

Я хочу запустить подзадачу (в потоке пула потоков) только на одном из экземпляров рабочей роли.

Моя первоначальная идея состояла в том, чтобы сделать что-то вроде этого:

ThreadPool.QueueUserWorkItem((o) => 
{ 
    if (RoleEnvironment.CurrentRoleInstance.Id == RoleEnvironment.Roles[RoleEnvironment.CurrentRoleInstance.Role.Name].Instances.First().Id) 
    { 
     emailWorker.Start(); 
    } 
}); 

Однако приведенный выше код опирающийся на коллекции Role.Instances всегда возвращающегося экземпляры в том же порядке. Это так? или можно вернуть предметы в любом порядке?

Есть ли другой утвержденный способ запуска задачи только для одного экземпляра роли?

Спасибо,

ответ

1

Джо, решение, которое вы ищете, как правило, полагаются на:

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

В любом случае вам необходимо пройти через хранилище Azure, чтобы оно работало. Я предлагаю взглянуть на Lokad.Cloud, поскольку мы разработали эту инфраструктуру с открытым исходным кодом, чтобы справиться с такими ситуациями.

0

Если им нужно делать разные вещи, это звучит так, как будто у вас нет двух экземпляров одной рабочей роли. На самом деле у вас есть две разные рабочие роли.

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

Одним из преимуществ разработки для Azure является то, что вы автоматически получаете масштабируемость, если правильно разрабатываете свое приложение. Если вы заработаете дополнительно, чтобы получить то, что не масштабируется, это то, что вы пытаетесь сделать.

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

Итак, если у вас есть одна рабочая роль, выполняющая подзадачу, а другая рабочая роль выполняет все остальное, просто добавьте 2 рабочих роли в решение Azure. Однако, даже если вы это сделаете, рабочая роль, обрабатывающая подзадачу, должна быть написана таким образом, что если вы когда-либо масштабируете ее, чтобы запускать более одного экземпляра, который будет работать должным образом. В этом случае вы можете также использовать единую рабочую роль и код для обработки сообщений из очереди, чтобы начать свою подзадачу.

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