2012-01-27 2 views
5

Это может быть простой вопрос, но я еще не видел прямого ответа. Скажем, я использую роль рабочего Azure для выполнения какой-то долговременной задачи, скажем, что требуется час. Теперь скажите, что MS решает, что рабочая роль требует некоторого обслуживания, и пытается закрыть ее на 30 минут в работе.Предотвращение прерывания работы лазури во время обработки

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

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

ответ

4

Вы можете обработать событие Stopping, чтобы остановить выключение экземпляра (в режиме плавного отключения). В ситуации сбоя вы не можете предотвратить остановку ...

Вот предложение по смягчению. Допустим, ваша задача управляется в очередь. Давайте притворимся, что ваше сообщение выглядит примерно как PROCESSWIDGET|123.

Вы читаете сообщение очереди в рабочем экземпляре и начинаете обработку. На самом деле вы можете изменить сообщение очереди и записать свой прогресс. Итак, в этом фиктивном примере, скажем, есть 4 шага, чтобы выполнить часовую задачу, каждая из которых занимает 15 минут. По мере завершения каждого шага вы можете обновить свое сообщение, добавив статус контрольной точки. Сразу после завершения первой задачи вы обновите сообщение, и теперь оно выглядит примерно как PROCESSWIDGET|123|STEP2.

Теперь ... что-то пошло не так, и экземпляр виртуальной машины умирает по какой-то причине. Сообщение очереди в конечном итоге становится видимым снова, другой рабочий экземпляр читает его и видит, что сообщение добавлено со следующим шагом для выполнения. Предполагая, что вы сохранили промежуточные файлы в хранилище Blob (или какое-то другое постоянное хранилище), вы можете выбрать, где вы остановились, и не перерабатывать с самого начала.

См. this MSDN page для получения более подробной информации о методе UpdateMessage().

+0

Также, только FYI - вы можете только отсрочить выключение в течение 5 минут. Затем он просто выключится. Как говорит Дэвид, это только для изящных выходов. – dunnry

+0

Да, я не слишком беспокоюсь о авариях. Это просто регулярное обслуживание. Одна из этих заданий придется импортировать 10 миллионов записей текстового файла каждую ночь. Я бы предпочел, чтобы Microsoft не закрыла мой экземпляр для обновлений во время этого процесса, потому что это займет некоторое время. Наверное, я мог отслеживать номер строки и просто начать с этого момента. –

+1

Если можно разбить этот импорт на партии, которые могут работать в parrallel? – BrentDaCodeMonkey

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