Служебные ролики Azure Cloud Service - автомасштабирование - изменение события не сжигание

Я получил развертывание Cloud Service с 4 рабочими ролями, один из которых активировал автомасштабирование. Как только происходит автоматическое масштабирование, все экземпляры всех ролей утилизируются.

В идеале я хотел бы остановить роли от повторного использования или, по крайней мере, закончить работу всех других ролей контролируемым образом.

Я узнал, что вы можете реагировать на событие RoleEnvironment.Changing и отменить его, чтобы запросить изящное завершение работы (т.е. вызвать OnStop). Однако, добавив вывод трассировки в обработчик события "Изменение", я заметил, что событие "Изменение", очевидно, даже не было запущено, поэтому аннулирование также не регистрировалось.

private void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e)
{
    // This tracing output does not show up in the logs table.
    Trace.TraceInformation("RoleEnvironmentChanging event fired.");
    if ((e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange)))
    {
        // This one neither.
        Trace.TraceInformation("One of the changes is a RoleEnvironmentConfigurationSettingChange. Cancelling..");

        e.Cancel = true;
    }
    if ((e.Changes.Any(change => change is RoleEnvironmentTopologyChange)))
    {
        // This one neither.
        Trace.TraceInformation("One of the changes is a RoleEnvironmentTopologyChange. Cancelling.");

        e.Cancel = true;
    }
}

public override bool OnStart()
{
    // Hook up to the changing event to prevent roles from unnecessarily restarting.
    RoleEnvironment.Changing += RoleEnvironmentChanging;

    // Set the maximum number of concurrent connections
    ServicePointManager.DefaultConnectionLimit = 12;

    bool result = base.OnStart();

    return result;
}

Также добавление внутренней конечной точки для каждой роли не принесло изменений. Здесь конфигурация из .csdef:

<WorkerRole name="MyRole" vmsize="Medium">
[...ConfigurationSettings...]
<Endpoints>
  <InternalEndpoint name="Endpoint1" protocol="http" />
</Endpoints>
</WorkerRole>

Также изменение протокола на "any" не было успешным.

Как я могу остановить экземпляры своей роли после повторного использования после операции масштабирования?

EDIT:
& RAQUO; Включенные фрагменты кода
& RAQUO; Исправлены опечатки

Ответ 1

Вы попытались выполнить одно из следующих действий?

  • Проверьте, запущено ли событие в экземплярах роли, которая автоматически масштабируется (чтобы убедиться, что это не проблема с внутренней конечной точкой)
  • Сделайте полное повторное развертывание (вместо обновления).
  • Добавить короткий Thread.Sleep() после вывода трассировки в обработчике событий (иногда роль закрывается до того, как можно будет зарегистрировать вывод трассировки)
  • Внесите изменения в одну из конфигураций через портал управления (и проверьте, запускается ли событие).
  • Проверить, запущены ли другие события (например, RoleEnvironment.Changed)

Ответ 2

Ничего себе, более 2 лет без реального ответа здесь. Очень жаль. Мой опыт в этой теме: установите e.Cancel на false, если ваш экземпляр сможет работать после и в то время как масштабирование без необходимости реконфигурации.

if (e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange)){
Trace.WriteLine("with recycle");
e.Cancel = true;
}
else {
Trace.WriteLine("without recycle");
e.Cancel = false;
}

Возможно, вы хотите установить Trace.AutoFlush = true в OnStart.

Ответ 3

Ролевые методы и события среды Есть пять основных мест, где вы можете написать код для реагирования на изменения среды. Два из них: OnStart и OnStop - это методы класса RoleEntryPoint, которые вы можете переопределить в своем основном классе ролей (который по умолчанию называется WebRole или WorkerRole). Остальные три являются событиями в классе RoleEnvironment, на которые вы можете подписаться: Изменение, изменение и остановка.

Цель этих методов довольно понятна из их имен:

OnStart gets called when the instance is first started.
Changing gets called when something about the role environment is about to change.
Changed gets called when something about the role environment has just been changed.

Остановка вызывает вызов, когда экземпляр будет остановлен. OnStop вызывается, когда экземпляр останавливается. Во всех случаях, ваш код не может сделать, чтобы предотвратить выполнение соответствующего действия, но вы можете ответить на него любым способом. В случае события изменения вы также можете выбрать, следует ли возвращать экземпляр для изменения конфигурации, установив e.Cancel = true.

Почему arent меняет и меняет стрельбу в моем приложении? Когда я впервые начал изучать эту тему, я заметил следующее необычное поведение как в эмуляторе Windows Azure Compute Emulator (ранее известном как Fabric Development), так и в облаке:

Изменения и изменения не срабатывали ни в одном из экземпляров, когда я внес изменения конфигурации. RoleEnvironment.CurrentRoleInstance.Role.Instances.Count всегда возвращался 1, даже если в роли было много экземпляров. Оказывается, это ожидаемое поведение, когда роль не имеет никаких внутренних конечных точек, как описано в этой статье MSDN. Таким образом, решение состоит в том, чтобы просто определить внутреннюю конечную точку в файле ServiceDefinition.csdef следующим образом:

<Endpoints>
  <InternalEndpoint name="InternalEndpoint1″ protocol="http" />
</Endpoints>

Какие события срабатывают где и когда? Несмотря на то, что имена событий кажутся довольно понятными, точное поведение при масштабировании развертываний вверх и вниз не обязательно то, что вы ожидаете. Следующая диаграмма показывает, какие события загораются в примере сценария, содержащего одну роль. Сначала развертываются 2 экземпляра, затем развертывание масштабируется до 4 экземпляров, затем возвращается до 3 и, наконец, развертывание останавливается.

взято из http://azure.microsoft.com/blog/2011/01/04/responding-to-role-topology-changes/