我正在使用Net Core 2.1中的新托管服务通过RabbitMq接收某些消息。
虽然我可以收到很多请求,但是我预计不会同时收到数十个请求。但是处理任务可能要花费很多时间(小时...天)
我不想等待RabbitMq消息停留那么长时间-如果检索到该消息,则可以确认该消息。
在这种情况下,是否只是通过Task.Run()启动新线程?
我曾考虑在内部Queue中排队消息,但在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);
}
});
}
答案 0 :(得分:2)
每次收到消息时都开始使用新的Task
会有弊端
Task
将会溢出内存,而应用程序只会崩溃。使用Hangfire或Quartz.NET,它们将逐渐在后台处理消息(具有其他好处,例如重试等)