Как Azure прерывает рабочую роль для развертывания?

Я перемещаю некоторую фоновую обработку из веб-роли Azure в рабочую роль. Мой рабочий должен выполнять задачу каждую минуту или около того, возможно, порождая задачи:

while(true){
    //start some tasks

    Thread.Sleep(60000);
}

Как только я развернусь, он начнет работать вечно. Итак, позже, при повторном развертывании, как Azure остановит мой процесс для повторного развертывания?

Просто сразу убивает? Есть ли способ получить предупреждение о том, что он закрывается? Должен ли я просто убедиться, что все транзакционно?


person bendytree    schedule 30.09.2012    source источник


Ответы (1)


Когда роль (рабочую или веб-роль) просят корректно завершить работу (поскольку она сокращается или потому что вы запросили повторное развертывание), OnStop вызывается метод класса RoleEntryPoint. Это тот же класс, в котором есть метод Run, который, вероятно, либо содержит ваш цикл, либо вызывает код, содержащий этот цикл.

Здесь следует отметить пару вещей: у OnStop есть 5 минут, чтобы фактически остановиться, после чего процесс просто уничтожается. Если вам нужно вызвать что-то еще для асинхронного завершения работы, вам нужно, чтобы поток в OnStop был занят, ожидая, пока этот другой процесс не будет закрыт. Как только выполнение перешло в состояние OnStop, платформа предполагает, что машину можно остановить.

Если вам нужно изящно остановить обработку, но это не требует выключения машины, вы можете поместить параметр в файл конфигурации службы, который вы можете обновить, чтобы указать, что работа должна быть выполнена или сделана заметка. Так, например, логическое значение «ProcessQueues». Затем в onStart в RoleEntryPoint вы перехватываете событие RoleEnvironmentChanging. Затем ваш обработчик событий ищет событие RoleEnvironmentConfigurationSettingChange, а затем проверяет логическое значение ProcessQueues. Если это правда, он либо запускает, либо продолжает обработку, если это ложь, он изящно останавливает обработку. Затем вы можете изменить конфигурацию, чтобы контролировать, когда что-то работает или нет. Это один из вариантов обработки, и есть еще много других, в зависимости от того, как быстро вам нужно остановить обработку и т. д.

person MikeWo    schedule 30.09.2012
comment
Привет, Майк, Can Worker Role может остановить себя сама по себе. - person user145610; 04.06.2013
comment
Вам нужно уточнить, что вы пытаетесь выполнить, существует несколько способов, которыми рабочая роль может перезапустить себя или убить себя, но если это не является частью операции уменьшения масштаба, Fabric Controller в конечном итоге попытается принести резервное копирование экземпляра роли. Возможно, задайте как более подробный и отдельный вопрос. - person MikeWo; 13.06.2013