Запустите IHostedService только на одном экземпляре масштабируемой службы приложений Azure.

Можно ли запустить IHostedService только на одном экземпляре масштабируемой службы приложений Azure в ASP.NET Core? Или решение состоит в том, чтобы запустить этот IHostedService в его собственной службе приложений с одним экземпляром?

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

Как я могу решить эту проблему?


comment
Я бы разместил код отправки электронной почты в функциях Azure, используя запланированный запуск таймера.   -  person Fabrizio Accatino    schedule 13.02.2021


Ответы (1)


Лучше разбить вещи на отдельные приложения, и здесь тоже так. Если вам нужен только один экземпляр размещенной службы, вам следует разбить его на отдельный проект и развернуть один его экземпляр. Если вы развернете его внутри своего приложения, для каждого экземпляра вашего приложения будет свой экземпляр; нет никакого способа обойти это, обратитесь к этому поток.

С размещенными службами для каждого развертывания вашего веб-сайта работает экземпляр этой размещенной службы, что может быть проблемой, если вы хотите, чтобы в любое время работал только один экземпляр этого «процесса». Вы можете запрограммировать это, создав свой собственный механизм блокировки, но очевидно, что веб-задания получают это из коробки. Таким образом, вы можете использовать веб-задание, работающее как синглтон, для достижения желаемого. См. статью о размещенных службах в ASP.NET. Ядро.

person Joey Cai    schedule 22.01.2020