Справочная служба губит Web производительность API

голоса
0

Я в настоящее время разрабатывает Web API, используемый нашим мобильным приложением. Если API-вызов сделан, который необходимо отправить по электронной почте, электронной почты добавляется в очередь в Azure Storage. Для обработки очереди (чтение почты очереди и фактически отправляя их) Я думал, что лучшим решением будет создание веб-сервис, который будет делать это в фоновом режиме.

Для реализации этого я следовал инструкциям из следующей документации: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-2.1

Я создал класс, который реализует абстрактный BackgroundService-класс от .NET 2.1 Ядра для этого. Это выглядит следующим образом:

namespace Api.BackgroundServices
{
    /// <summary>
    /// Mail queue service.
    /// This handles the queued mails one by one.
    /// </summary>
    /// <seealso cref=Microsoft.Extensions.Hosting.BackgroundService />
    public class MailQueueService : BackgroundService
    {
        private readonly IServiceScopeFactory serviceScopeFactory;

        /// <summary>
        /// Initializes a new instance of the <see cref=MailQueueService/> class.
        /// </summary>
        /// <param name=serviceScopeFactory>The service scope factory.</param>
        public MailQueueService(IServiceScopeFactory serviceScopeFactory)
        {
            this.serviceScopeFactory = serviceScopeFactory;
        }

        /// <summary>
        /// This method is called when the <see cref=T:Microsoft.Extensions.Hosting.IHostedService /> starts. The implementation should return a task that represents
        /// the lifetime of the long running operation(s) being performed.
        /// </summary>
        /// <param name=stoppingToken>Triggered when <see cref=M:Microsoft.Extensions.Hosting.IHostedService.StopAsync(System.Threading.CancellationToken) /> is called.</param>
        /// <returns>A <see cref=T:System.Threading.Tasks.Task /> that represents the long running operations.</returns>
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                await HandleMailQueueAsync();
                //await Task.Delay(3000, stoppingToken);
            }
        }

        private async Task HandleMailQueueAsync()
        {
            using (IServiceScope serviceScope = serviceScopeFactory.CreateScope())
            {
                TelemetryClient telemetryClient = serviceScope.ServiceProvider.GetService<TelemetryClient>();

                try
                {
                    IMailHandler mailHandler = serviceScope.ServiceProvider.GetService<IMailHandler>();
                    await mailHandler.HandleMailQueueAsync();
                }
                catch (Exception exception)
                {
                    telemetryClient.TrackException(exception);
                }
            }
        }
    }
}

После регистрации его по телефону

services.AddHostedService<MailQueueService>();

в Startup.cs, он будет успешно обрабатывать очередь почты, но все остальные вызовы WebAPI принимать почти в десять раз дольше. Только если я закомментируйте Task.Delay () часть в моей реализации BackgroundService, производительность возвращается к приемлемому уровню.

Однако это больше похоже на обходной путь, чем реальное решение для моей проблемы. Могу ли я делать что-то еще неправильно, что делает танк производительности, как это?

Задан 27/11/2018 в 15:03
источник пользователем
На других языках...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more