带有进度通知的长时间运行的后台任务
Posted
技术标签:
【中文标题】带有进度通知的长时间运行的后台任务【英文标题】:Long-running background tasks with progress notifications 【发布时间】:2015-10-27 09:09:24 【问题描述】:我有一个 ASP.NET 网站,其中包含许多长时间运行(5 分钟到 2 小时)的用户启动任务。我希望每个用户都能看到自己工作的进度,并能够关闭他们的浏览器并在稍后返回。
当前计划是在每个作业启动时将其存储在数据库中,并将消息发布到 RabbitMQ 队列,Windows 服务将接收该队列并开始处理该作业。
但是,我不确定将进度信息从服务传回网络服务器的最佳方式?我看到两个选项:
将进度信息存储在数据库中,并让网络应用对其进行轮询 在 Web 服务器中有一个 RabbitMQ 消费者,并让 Windows 服务将进度消息发布到该队列我倾向于第二个选项,因为我真的不想通过定期轮询/写入进度信息来增加数据库的开销。但是,有lots 和warnings 关于使用RabbitMQ(作为消费者) - 因为我没有发送重要消息(如果不处理进度消息并不重要),我想知道这是否重要?每当重新启动 Web 应用程序时,重新启动 RabbitMQ 消费者并不是(著名的遗言)。
这个选项听起来合理吗?还有更好的选择吗?
【问题讨论】:
【参考方案1】:将进度信息存储在数据库中,并让网络应用对其进行轮询 在 Web 服务器中有一个 RabbitMQ 消费者,并让 Windows 服务将进度消息发布到该队列
正确答案是C) 以上所有!
数据库不是应用程序的集成层。
RabbitMQ 不适合最终用户消费消息。
但是当你将 RabbitMQ 与数据库结合起来时,你会得到美丽的东西......
让您的后台服务通过 RabbitMQ 发送进度更新。 Web 服务器将侦听这些更新并将新状态写入数据库。使用 websockets (signalr) 立即将进度更新推送给用户,但您仍然在数据库中拥有当前状态,以防用户完全刷新页面或稍后返回。
我在 using rabbitmq to do user notifications 的博客文章中写到了这个基本设置
【讨论】:
感谢@DerickBailey ...这就是我最终要做的。我应该提到我已经在使用 SignalR 向用户提供反馈 - 问题不清楚,但我只是询问有关通知网络 服务器 的问题。无论如何,很高兴从我在推特上关注的人那里得到答案:)以上是关于带有进度通知的长时间运行的后台任务的主要内容,如果未能解决你的问题,请参考以下文章