7

我正在使用 AngularJS 和 ASP.Net WebAPI 开发客户端单页应用程序 (SPA)。

SPA 的功能之一包括上传大型 CSV 文件,在服务器上对其进行处理,并将输出返回给用户。

显然,这种计算不能在线完成,因此我实现了一个 UploadController 负责接收文件,一个 PollingController 负责在计算完成时通知用户。

客户端应用程序每隔几秒监视一次 PollingController。

我没有消息队列方面的经验,但我的直觉告诉我,在这种情况下需要它们。

您建议如何以非阻塞、高效的方式实现此功能?

图表

例子将不胜感激

4

2 回答 2

7

我过去曾为此使用过基于消息的服务总线框架。

您编写了一个应用程序(作为 Windows 服务运行),它侦听通过事件总线广播的消息。

您的前端可以将这些消息发布到总线上。

.NET 中最流行的框架是NServiceBus,但它最近变得商业化。您也可以查看MassTransit,尽管该文档的文档很差。

您将执行的工作流程:

  • MVC App 接受上传并将其放置到 Windows 服务可访问的某个目录中
  • MVC App 发布“UploadReady”消息。
  • 服务接收消息、处理文件并更新轮询控制器的某些状态。
  • 轮询控制器监视此状态的变化。通常是数据库记录等。

使用这样的框架的好处是,如果您的服务出现故障,或者您重新部署它,任何处理都可以排队和恢复,因此您不会有任何停机时间。

于 2013-09-03T01:06:52.657 回答
5

对于长时间运行的操作,您需要单独的 Windows 服务应用程序(或 Worker Role,如果它是 Windows Azure)。IIS 可能会在池回收时终止 ASP.NET 进程,并且您的操作将无法完成。

消息队列主要用于通信。你可以在你的 web 和 worker 部件之间使用它。但除非您的数据不是超级关键,否则它不是必需的。您可以使用数据库、缓存、文件系统或 100 种其他不同方式建立通信 :)

您可以使用 SignalR 通知您的客户有关已完成的处理。

于 2013-09-02T09:13:10.970 回答