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

Sim*_*mon 0 architecture asp.net windows-services rabbitmq long-running-processes

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

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

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

  • 将进度信息存储在数据库中,并通过网络应用程序对其进行轮询
  • 在网络服务器中有一个 RabbitMQ 消费者,并让 Windows 服务将进度消息发布到该队列

我倾向于第二种选择,因为我真的不想通过定期轮询/写入进度信息来增加数据库的更多开销。然而,有很多关于使用 RabbitMQ(作为消费者)的警告- 因为我没有发送重要消息(如果进度消息没有被处理也没关系),我想知道这是否重要?这并不是困难(著名的遗言)。

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

Der*_*ley 6

  • 将进度信息存储在数据库中,并通过网络应用程序对其进行轮询
  • 在网络服务器中有一个 RabbitMQ 消费者,并让 Windows 服务将进度消息发布到该队列

正确答案是C) 以上全部!

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

RabbitMQ 不适用于最终用户消费消息。

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

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

我在一篇关于使用rabbitmq进行用户通知的博客文章中写了这个基本设置