Запустить задачу самостоятельно? - PullRequest
0 голосов
/ 26 июня 2018

Я использую новую размещенную службу в Net Core 2.1 для получения некоторых сообщений через RabbitMq.

Хотя я могу получить достаточное количество запросов, я не ожидаю десятки или около того одновременно. Но обработка задачи может занять много времени (часы ... дни)

Я не хочу ждать, пока мое сообщение RabbitMq останется так долго - если я получу сообщение, я смогу подтвердить его.

Хорошая идея в этом сценарии - просто запустить новый поток с помощью Task.Run ()?

Я думал об очереди сообщения во внутренней очереди, но не нашел хорошего решения в ядре Linux Net.

Текущий код выглядит так:

        public async Task StartAsync(CancellationToken cancellationToken)
                {
                    _logger.LogInformation($"Starting 
     nameof(NewTaskHandlerService)}");
          await _rabbit.SubscribeAsync<CalculationTask>(async (message) =>
                    {
                        _logger.LogInformation($"New Task: {message.InstanceId}");
                        try
                        {
// this can take ages, I want to start this independently
                            Task.Run(async () =>
                            {
                                using (var scope = _services.CreateScope())
                                {
                                    var scopedProcessingService =
                                        scope.ServiceProvider
                                            .GetRequiredService<ICalculationTaskHandler>();

                                    await scopedProcessingService.StartCalculationTask(message);

                                }
                            });

                            return new Ack();

                        }
                        catch (Exception e)
                        {
                            _logger.LogError(0, e, "Error while handling new task. Marking Workflow {} task {} as failed",
                                message.ParentCalculationId, message.InstanceId);
                            return new Nack(true);
                        }
                    });
        }

1 Ответ

0 голосов
/ 26 июня 2018

Запуск нового Task каждый раз, когда вы получаете сообщение, имеет недостатки

  1. Ненадежно, если вы получаете слишком много сообщений, слишком много Task с переполнит память, и приложение просто рухнет.
  2. Нет просмотра в реальном времени состояния сообщений, сколько из них в настоящее время обрабатывается, не удалось, успешно.
  3. Нет возможности повторить процесс сбой сообщений.
  4. Сообщения обрабатываются мгновенно, после некоторого промежутка времени обработка невозможна (например, ночная обработка)

Используйте Hangfire или Quartz.NET , который будет обрабатывать обработку сообщений в фоновом режиме (с другими преимуществами, такими как повторная попытка и т. Д.)

...