.Net core Hosted Services гарантированно завершена - PullRequest
0 голосов
/ 03 июля 2018

Я смотрю на новую функцию .Net-Core 2.1 Службы хостинга , Я вижу, что они очень похожи на QueueBackgroundWorkItem

Кажется, что задание фонового рабочего элемента имеет ограничение на выполнение задачи в течение 90 секунд

Завершение работы AppDomain может быть отложено только на 90 секунд (на самом деле это минимум HttpRuntimeSection.ShutdownTimeout и processModel shutdownTimeLimit). Если у вас в очереди столько элементов, что их невозможно выполнить за 90 секунд, среда выполнения ASP.NET будет выгружать домен приложений, не дожидаясь завершения рабочих элементов.

По-разному ли размещаются службы, или это ограничение по-прежнему применяется?

Я беспокоюсь, что если я поставлю что-то в очередь на моем размещенном сервисе, если это действительно долго выполняемая задача, гарантированно ли она будет выполнена?

1 Ответ

0 голосов
/ 07 июля 2018

В рамках попытки корректно завершить работу веб-хоста создается токен отмены в сочетании с настроенным ShutdownTimeout

var timeoutToken = new CancellationTokenSource(Options.ShutdownTimeout).Token;
if (!cancellationToken.CanBeCanceled)
{
    cancellationToken = timeoutToken;
}
else
{
    cancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutToken).Token;
}

Источник

Это становится маркером отключения при остановке размещенных служб.

// Fire the IHostedService.Stop
if (_hostedServiceExecutor != null)
{
    await _hostedServiceExecutor.StopAsync(cancellationToken).ConfigureAwait(false);
}

Изучая потенциальные проблемы с размещенными сервисами, я обнаружил следующее из официальной документации.

Особенности развертывания и выводы

Важно отметить, что способ развертывания ASP.NET Core WebHost или .NET Core Host может повлиять на окончательное решение. Например, если вы развернете свой WebHost в IIS или обычной службе приложений Azure, ваш хост может быть отключен из-за перезагрузки пула приложений. Но если вы развертываете свой хост как контейнер в оркестратор, такой как Kubernetes или Service Fabric, вы можете контролировать определенное количество живых экземпляров своего хоста. Кроме того, вы можете рассмотреть другие подходы в облаке, специально разработанные для этих сценариев, такие как функции Azure.

Но даже для WebHost, развернутого в пуле приложений, существуют сценарии, такие как повторное заполнение или очистка кеша приложения в памяти, которые все еще будут применимы.

Интерфейс IHostedService предоставляет удобный способ запуска фоновых задач в веб-приложении ASP.NET Core (в .NET Core 2.0) или в любом процессе / хосте (начиная с .NET Core 2.1 с IHost). Его основным преимуществом является возможность, которую вы получаете благодаря постепенной отмене кода очистки ваших фоновых задач при завершении работы самого хоста.

Теперь из этого, исходя из ваших опасений, я бы понял, что нет никаких гарантий, что ваши долгосрочные задачи будут выполнены, но им может быть предоставлена ​​возможность постепенного отмены в зависимости от среды хостинга, как объяснено в приведенном выше заявлении.

...