gpt4 book ai didi

c# - 如何在 ASP.NET Web API 中对后台任务进行排队

转载 作者:可可西里 更新时间:2023-11-01 03:14:20 26 4
gpt4 key购买 nike

我有一个 webapi,旨在以队列方式处理报告。应用程序执行的步骤如下:

  • 接收内容
  • 将内容映射到一个对象并将其放入队列
  • 轮询队列中的未决项目
  • 一次处理一个队列中的项目

我在考虑使用 Entity Framework 来创建一个队列项目的数据库,例如:

public class EFBatchItem
{
[Key]
public string BatchId { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateCompleted { get; set; }
public string BatchItem { get; set; }
public BatchStatus Status { get; set; }
}

我的问题 - 使用 NServiceBus、BlockingCollection 或 ConcurrentQueue 是否有比不断轮询数据库并一个一个地提取待处理项目更有效的方法?我以前没有使用过队列。

一个想法是创建一个任务队列,并在一个单独的线程上处理所有待处理的任务。有点类似于Most efficient way to process a queue with threads但我想确保我走的是最有效的路线。

编辑:我在这里遇到的一个大问题是向用户显示进度的最佳方式。用户提交内容后,他将被带到一个新页面,并可以通过批标识符查看状态。是否需要 MSMQ 或 NServiceBus 才能通知用户?这似乎是 REquest/Acknowledge/Push 范式的变体?

最佳答案

恕我直言,您的 ASP.NET Web API 应用程序不应自行运行这些后台任务。它应该只负责接收请求,将其放在队列中(如您所指示的)并返回指示接收消息成功或失败的响应。您可以使用各种消息系统,例如 RabbitMQ对于这种方法。

至于通知,您有几种选择。您可以有一个端点,客户端可以检查处理是否完成。或者,您可以提供客户端可以订阅的流式 API 端点。这样,客户端不必轮询服务器;服务器可以通知已连接的客户端。 ASP.NET Web API 有一种很好的方法可以做到这一点。以下博客文章解释了如何:

你也可以考虑SignalR对于这种类型的服务器到客户端的通知。

后台任务对于 ASP.NET Web API 应用程序来说很难的原因是你有责任让 AppDomain 保持事件状态。这是一个麻烦,尤其是当您在 IIS 下托管时。以下博客文章很好地解释了我的意思:

关于c# - 如何在 ASP.NET Web API 中对后台任务进行排队,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14710822/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com