2014-02-11 2 views
0

У меня есть веб-роль облачных сервисов Azure, которая должна выполнить вызов службы REST при ее запуске, а затем, когда она отключится, чтобы зарегистрировать экземпляр роли с помощью прокси-сервера при запуске и удалите его при остановке. Я перепробовал методы OnStart() и OnStop(), чтобы добавить вызовы, и он работает как ожидалось во всех случаях, кроме случаев, когда он уменьшается. При остановке службы облачных вычислений или перезапуска экземпляра роли вызов службы REST в методе OnStop() выполняется и завершается успешно. При масштабировании запускается метод OnStart(), и вызов службы REST регистрирует новый экземпляр роли с прокси-сервером. Однако при масштабировании вниз он выглядит так, как никогда не работает метод OnStop(). Я также попытался использовать обработчик события RoleEnvironmentStopping, поскольку у него нет ограничения по времени, но результат был таким же. Я не могу найти подробную документацию от Microsoft о точном жизненном цикле экземпляра роли во время действия масштабирования. Когда я смотрю на свою виртуальную сеть, похоже, что экземпляр роли успешно удалил IP-адрес, прежде чем vm будет уничтожен. Имеет ли смысл, что при масштабировании экземпляр роли не имеет доступа к сети при вызове метода OnStop()? Есть ли где-нибудь еще я могу/должен делать эту очистку?azure cloud service OnStop() и RoleEnvironmentStopping не вызваны масштабированием

ответ

1

OnStop вызывается во время операций по уменьшению масштаба. Обычно, когда я видел эту проблему, это связано с тем, что код в OnStop записывается в диагностику (т. Е. Линии Diagnostics.Trace), но Windows Azure Diagnostics не имеет достаточного времени для переноса данных диагностики на хранение до того, как виртуальная машина закрыта вниз. Это делает его похожим на OnStop, который не вызывается, но на самом деле это не журналы, которые не помещаются на хранение.

Есть несколько способов, чтобы убедиться в этом:

  1. вручную написать что-то для хранения в OnStop. Вы можете добавить сообщение в очередь, написать запись в таблицу и т. Д.
  2. Принудительная передача данных по требованию в OnStop. Вы можете увидеть пример кода в функции RequestOnDemandTransfer() в http://www.packtpub.com/article/digging-into-windows-azure-diagnostics-tutotial.
  3. Подключите отладчик и установите точку останова на свой метод OnStop. Если вы используете SDK 2.2, вы можете использовать функцию удаленного отладчика из инструмента Server Explorer в Visual Studio. Если вы этого не сделаете, вам нужно будет использовать WinDBG для самой виртуальной машины.
+0

Мне нужна эта очистка для надежной работы каждый раз, когда экземпляр роли закрыт. Вот почему я также попытался поместить его в обработчик события RoleEnvironmentStopping (исправил опечатку в оригинале, где я сказал RoleEnvironmentChanging), но поведение точно такое же. Я понимаю, что обработчик событий не имеет ограничения по времени, например, метод OnStop() делает это, чтобы разместить код очистки, который вы не можете позволить прервать. Правильно ли это понимание? – brushwood

+1

Вся последовательность остановки (событие остановки и метод OnStop) имеет ограничение в 5 минут. См. Http://blogs.msdn.com/b/windowsazure/archive/2013/01/14/the-right-way-to-handle-azure-onstop-events.aspx. – kwill

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