.Net core Hosted Services гарантированно завершена
Я смотрю на новую функцию.Net-Core 2.1 Hosted Services и вижу, что они очень похожи на QueueBackgroundWorkItem
Кажется, что задание фонового рабочего элемента имеет ограничение на выполнение задачи в течение 90 секунд.
Завершение работы AppDomain может быть отложено только на 90 секунд (на самом деле это минимум HttpRuntimeSection.ShutdownTimeout и processModel shutdownTimeLimit). Если у вас в очереди столько элементов, что их невозможно выполнить за 90 секунд, среда выполнения ASP.NET будет выгружать домен приложений, не дожидаясь завершения рабочих элементов.
Различное поведение хостинговых служб или это ограничение по-прежнему применяется?
Я беспокоюсь, что если я поставлю что-то в очередь на моем размещенном сервисе, если это действительно длительное задание, гарантируется ли его выполнение?
1 ответ
В рамках попытки корректно завершить работу веб-хоста создает токен отмены в сочетании с настроенным 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). Его основным преимуществом является возможность, которую вы получаете благодаря постепенной отмене кода очистки фоновых задач, когда сам хост выключается.
Исходя из этого, исходя из ваших опасений, я понял, что нет никаких гарантий, что ваши долгосрочные задачи будут выполнены, но им может быть предоставлена возможность постепенного отмены в зависимости от среды размещения, как объяснено в приведенном выше заявлении.