Фон
Я пытаюсь разработать наилучшую структуру для приложения Azure. Каждая из моих рабочих ролей будет запускать несколько длительных заданий. Со временем я могу переносить задания из одного экземпляра в другой, переключая их в режим только для чтения в исходном экземпляре, запуская их в целевом экземпляре, а затем запуская исходный экземпляр в исходном экземпляре.
Если у меня слишком много заданий, я могу указать Azure развернуть дополнительный экземпляр роли и использовать его для новых заданий. И наоборот, если моя нагрузка падает (например, ночью), я могу объединить невыполненные задания на нескольких машинах и сказать Azure, чтобы мне давали меньше экземпляров.
Проблема в том, что (насколько я понимаю) Azure не предоставляет механизма, позволяющего мне решить, какой экземпляр остановить. Таким образом, я не могу знать, на каких серверах выполнять консолидацию, и некоторые из моих заданий умирают, когда их экземпляры останавливаются, вызывая задержки для пользователей, пока я перезапускаю эти задания на уцелевших экземплярах.
Идея 1: я решаю, какой экземпляр остановить, и вернуться из его Run(). Затем я говорю Azure уменьшить количество моих экземпляров на один и надеюсь, что он решит, что сломанный экземпляр является хорошим кандидатом. Кто-нибудь пробовал что-нибудь подобное?
Идея 2: я предопределяю целую кучу разных рабочих ролей с одинаковым содержимым. Я могу индивидуально останавливать и запускать их, переключая количество экземпляров с нуля на единицу и обратно. Я думаю, что эта идея сработает, но мне она не нравится, потому что кажется, что она идет вразрез с естественным способом ведения дел в Azure, а также потому, что она требует от меня большого количества дополнительной бухгалтерии для управления дополнительными рабочими ролями.
Идея 3: живите с этим.
Есть идеи получше?