luk*_*egf 2 c# rabbitmq reporting-services asp.net-web-api
因此,我有一个SPA(单页应用程序),其中AngularJS作为前端,.NET Web API作为后端(C#)。我需要根据某些用户操作来生成SQL Server Reporting Services(SSRS)报告,即选择一些数据并按一个按钮。这是我现有架构的粗略插图:
FRONT END BACK END SSRS Report
========== ========= ===========
**AngularJS Web page**-->**.NET Web API controller**-->**Intermediary class (passes arguments to report)** -->**Generate report and save to file**
Run Code Online (Sandbox Code Playgroud)
这行得通,但问题是在生成报告时,应用程序必须坐在那里等待它们完成,同时用户无法执行任何操作。如果要创建许多报告(例如100多个),则可能要花一两分钟以上的时间,这对我来说是不可接受的。
因此,这就是RabbitMQ的用处。我的想法是让.NET Web API控制器将消息发送到服务器,一旦服务器接收到消息,就会对上面的中间类进行调用,从而生成报告,然后响应发送回客户端,让他们知道已生成报告。我认为我需要为此使用RPC方案,因此我已经在RabbitMQ网站上完成了相应的教程,而且看起来很简单。
我不知道的是,这是我的问题,是如何从.NET Web API应用程序启动客户端和服务器。坦白说,我现在有点迷茫,因为这是我第一次体验任何消息,并且在架构方面我不确定如何处理它。如果我能详细了解整个工作原理,则可以从那里进行编码,但是到现在为止,我很难想象如何构造应用程序。
所以,问题:
如何从.NET Web API控制器启动RabbitMQ服务器和客户端?服务器和客户端应该是类库还是控制台应用程序,还是完全其他?
我正在构想的体系结构可以工作还是有更好的方法?
任何有关如何实现我要达到的目标的一般建议将不胜感激。
RabbitMQ服务器不是您从控制器启动的东西-它始终在运行。您可以从控制器向Rabbitmq服务器发送消息。另一方面,另一个应用程序(Windows服务,控制台应用程序,甚至Linux上的mono服务)侦听并处理这些消息。RabbitMQ服务器仅管理端点之间的消息发送。在您的情况下,处理来自控制器的消息的应用程序也始终在运行(将其设置为Windows服务是合理的)。
这样的体系结构是可以的。RabbitMQ可能是一个过大的杀伤力-对于多服务器,高负载的情况更是如此。如果您的负载较低,并且所有应用程序都在同一台服务器上,则可以使用其他工具(例如hangfire.io,MSMQ,甚至可以在Web服务器进程中运行后台任务,如另一个答案所示)。如果简单的工具可以胜任您的工作-为什么不呢?
生成报告时,不要一直保持从客户端(浏览器)到服务器的连接。只需将任务放在Rabbit队列中进行处理(否则将开始生成报告)并返回。然后,如果作业完成,则定期从客户端轮询,或者(更好)通过websocket连接通知客户端。如果生成报告可能要花费一些时间(比如说超过30秒),则当然是这样。
更新:有关整体体系结构的更多信息。
| 归档时间: |
|
| 查看次数: |
3940 次 |
| 最近记录: |