具有进度通知的长时间运行后台任务

时间:2015-10-27 09:09:24

标签: asp.net architecture windows-services rabbitmq long-running-processes

我有一个ASP.NET网站,其中包含许多长时间运行(5分钟到2小时)的用户启动任务。我希望每个用户都能够看到自己的工作进度,并能够关闭他们的浏览器并在以后返回。

当前计划是在数据库启动时将每个作业存储在数据库中,并将消息发布到RabbitMQ队列,Windows服务将接收该队列并开始处理作业。

但是,我不确定将进度信息从服务传递回网络服务器的最佳方法?我看到两个选择:

  • 将进度信息存储在数据库中,并对其进行web-app轮询
  • 在网络服务器中拥有一个RabbitMQ使用者,并让Windows服务将进度消息发布到该队列

我倾向于第二个选项,因为我不想通过定期轮询/写入进度信息来增加数据库的开销。但是,有lots warnings关于使用RabbitMQ(作为消费者) - 因为我没有发送重要消息(如果没有处理进度消息也没关系),我想知道如果这很重要?每当重新启动Web应用程序时,(着名的遗言)都难以重启RabbitMQ消费者。

这个选项听起来合理吗?还有更好的选择吗?

1 个答案:

答案 0 :(得分:3)

  
      
  • 将进度信息存储在数据库中,并对其进行web-app轮询
  •   
  • 在网络服务器中拥有一个RabbitMQ使用者,并让Windows服务将进度消息发布到该队列
  •   

正确的答案是 C)All Of The Above!

数据库不是应用程序的集成层。

RabbitMQ不适合最终用户使用消息。

但是当你将RabbitMQ与数据库结合起来时,你会得到漂亮的东西......

让您的后台服务通过RabbitMQ发送进度更新。 Web服务器将侦听这些更新并将新状态写入数据库。使用websockets(signalr)立即将进度更新推送给用户,但是如果用户完全刷新页面或稍后返回,您仍然可以在数据库中保持当前状态。

我在using rabbitmq to do user notifications

的博客文章中写到了这个基本设置