воскресенье, 6 июля 2014 г.

Azure : instance status и load balancer

Часто возникает непонимание того, как связаны статус инстанса и наличие входящего трафика на инстанс. Иными словами, отвечу на популярный вопрос: почему на инстанс идет трафик, хотя он находится в состоянии busy?

Для начала стоит запомнить: в общем случае статус инстанса и решение Azure load balancer'а посылать ли трафик на него, никак не связаны. Т.е. инстанс может быть в состоянии busy, но трафик на него будет идти. Или наоборот, инстанс может быть ready, но трафик на него не попадет.
Рассмотрим самый простой вариант - Вы не настраивали load balancer probe. В этом случае LB решает посылать ли трафик по статусу инстанса. Если ready - шлем, busy - не шлем. Все просто. Однако стоит Вам добавить probe как эта логика перестает работать, из-за чего возникает тот самый вопрос из ката. Идея простая - Вы написали свою логику для LB, а значит она и должна все учитывать, чтобы Вы не делали со статусом инстанса (если вы конечно не запросили recycle).

Допустим Вы реализовали всю необходимую логику и инстанс не попадает в ротацию пока он не проинициализирован или имеет какие-то проблемы. Тогда у Вас появилась другая проблема - инстанс трафик не обрабатывает, но в дашборде он виден как ready. Если таких инстансов становится все больше и больше, то пользовательские запросы будут обрабатываться все медленнее и медленнее, а может и вовсе перестанут. Значит Вам нужно как-то нотифицировать себя, что инстанс вышел из ротации. Вы можете реализовать это через свои инструменты (какая-то своя дашборда у вас полюбому будет), а можете просто выставить статус инстансу. В этом случае Вы хотя бы увидите где проблемы, когда Вас разбудят ночью. А можете реализовать автоматический ребут инстанса при долгом нахождении в busy state, тогда может и будить не будут:).

Как связывать статус инстанса с результатом probe - решать вам. Можете посылать запрос на probe endpoint, можете использовать объект ядра, а можете named pipe. Все что придумаете. Стоит только помнить следующте моменты:

  • Класс web role и Asp.Net application работают в разных процессах.
  • Asp.Net application не стартует вместе с web role. IIS запскает его только при первом запросе.
  • В общем случае временных ограничений на выполнение OnStart метода нет (напомню на OnStop дается только 5 минут). Однако в случае обновления host'а на выполнение OnStart отводится 15 минут. При окончании 15 минут с инстансом ничего не делают, просто начинают рестартить следующий, который может быть в другом upgrade domain, что в свою очередь может привести к отсутствию работающих инстансов.

Комментариев нет: