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