我有一个ASP.NET网站,其中包含许多长时间运行(5分钟到2小时)的用户启动任务。我希望每个用户都能够看到自己的工作进度,并能够关闭他们的浏览器并在以后返回。
当前计划是在数据库启动时将每个作业存储在数据库中,并将消息发布到RabbitMQ队列,Windows服务将接收该队列并开始处理作业。
但是,我不确定将进度信息从服务传递回网络服务器的最佳方法?我看到两个选择:
我倾向于第二个选项,因为我不想通过定期轮询/写入进度信息来增加数据库的开销。但是,有lots warnings关于使用RabbitMQ(作为消费者) - 因为我没有发送重要消息(如果没有处理进度消息也没关系),我想知道如果这很重要?每当重新启动Web应用程序时,(着名的遗言)都难以重启RabbitMQ消费者。
这个选项听起来合理吗?还有更好的选择吗?
答案 0 :(得分:3)
- 将进度信息存储在数据库中,并对其进行web-app轮询
- 在网络服务器中拥有一个RabbitMQ使用者,并让Windows服务将进度消息发布到该队列
正确的答案是 C)All Of The Above!
数据库不是应用程序的集成层。
RabbitMQ不适合最终用户使用消息。
但是当你将RabbitMQ与数据库结合起来时,你会得到漂亮的东西......
让您的后台服务通过RabbitMQ发送进度更新。 Web服务器将侦听这些更新并将新状态写入数据库。使用websockets(signalr)立即将进度更新推送给用户,但是如果用户完全刷新页面或稍后返回,您仍然可以在数据库中保持当前状态。
的博客文章中写到了这个基本设置