Были ли фоновые задачи, которые запускаются регулярно
Что проверяют
Был ли у вас реальный опыт с задачами по расписанию и знаете ли вы, что ломается, когда приложение работает в нескольких экземплярах. Следом спрашивают, как вы обрабатывали сбои и что будет, если задача не успеет закончиться до следующего запуска.
Как отвечать
Опишите свой случай по схеме: что делала задача, как часто, на чём была сделана, какие проблемы встретили. Инструменты .NET, которые стоит уметь сравнить:
BackgroundServiceсPeriodicTimer: встроено в хост, без сторонних пакетов, подходит для простых задач в одном экземпляре. Сервис живёт как singleton, поэтомуDbContextполучают черезIServiceScopeFactory, создавая новый scope на каждую итерацию;- Hangfire:
RecurringJob.AddOrUpdate<OrderJob>("check-orders", j => j.RunAsync(), "*/30 * * * *"), хранилище в SQL Server, PostgreSQL или Redis, панель мониторинга, автоматические повторы при исключении; - Quartz.NET: гибкие триггеры и календари, кластерный режим через
AdoJobStore, атрибут[DisallowConcurrentExecution]; - внешний планировщик: Kubernetes CronJob или timer trigger в Azure Functions, когда задачу выгоднее вынести из веб-приложения.
Затем проблемы и решения: несколько подов запускают одну задачу одновременно (нужна распределённая блокировка или кластерный режим), задача падает на середине (идемпотентность, повторный запуск не шлёт письма второй раз), при деплое задача останавливается корректно через CancellationToken.
Детали и цифры давайте из своего проекта. Если регулярных задач вы не писали, скажите честно и расскажите, как сделали бы: что выберете и какие риски учтёте.
Где спотыкаются
Пишут while (true) с Task.Delay без обработки ошибок. Необработанное исключение в ExecuteAsync начиная с .NET 6 по умолчанию останавливает весь хост, а если глушить исключения целиком, задача молча перестаёт работать.
Забывают про масштабирование: локально задача срабатывает раз в полчаса, а на трёх репликах шлёт клиенту три одинаковых письма.
Держат планировщик внутри приложения на IIS и удивляются пропускам: пул приложений перезапускается и засыпает без трафика, вместе с ним спит и расписание.