Как запустить подзадачу только на одном экземпляре Worker Role - PullRequest
1 голос
/ 04 февраля 2010

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 06 февраля 2010

Джо, решение, на которое вы обычно рассчитываете:

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

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

0 голосов
/ 15 апреля 2010

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

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

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

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

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

...