我现在有一个相关但不同的问题。在我的asp.net-mvc上,我已经构建了一些报告页面,您可以在其中生成excel报告(i am using EPPlus)和powerpoint报告(i am using aspose.slides)。以下是控制器操作示例:
public ActionResult GenerateExcelReport(FilterParams args) { byte[] results = GenerateLargeExcelReportThatTake30Seconds(args); return File(results,@"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml","MyReport.xlsx"); }
这个功能非常好,但是我试图弄清楚这些昂贵的操作(一些报告可能需要30秒才能返回)会影响其他用户。在前一个问题中,我有一个昂贵的操作,用户DIDN“T必须等待,但在这种情况下,他必须等待作为一个同步的活动(单击生成报告,并期望用户在其完成时获得报告)
在这种情况下,我不在乎主要用户必须等待30秒,但我只是想确保我不会对其他用户产生负面影响,因为这个昂贵的操作,生成文件等
这个用例在asp.net-mvc中有最好的做法吗?
解决方法
SignalR notification from server to client
备用选项是在客户端实现轮询机制。
发送一个ajax调用enque一个hangfire作业来生成报告。
然后开始轮询一些api使用另一个提供状态的ajax调用,并且报告准备好后,检索它。我更喜欢使用SignalR而不是轮询。
如果报表处理影响到Web服务器的性能,请将该处理卸载到另一个服务器。您可以使用消息传递(ActiveMQ或RabbitMQ或您选择的其他一些框架)或休息api调用来启动另一台服务器上的报告生成,然后再次使用消息传递或休息呼叫来通知报告生成完成回到Web服务器,最后SignalR通知客户。这将使Web服务器更加灵敏。
UPDATE
关于你的问题
Is there any best practice here in asp.net-mvc for this use case
你必须超时监控你的应用程序。监控客户端和服务器端。你可以依靠几种工具,如newrelic,app动态。我已经使用newrelic,它有功能来跟踪客户端浏览器以及服务器端的问题。产品名称为“NewRelic Browser”和“NewRelic Server”。我相信还有其他的工具可以捕捉类似的信息。
分析指标超时,如果看到任何异常,则采取适当的措施。如果您观察到服务器端cpu和内存峰值,请尝试在客户端大概相同的时间范围内捕获指标。在客户端,如果您注意到任何超时问题,连接错误意味着您的应用程序用户无法连接到您的应用程序,而服务器正在做一些繁重的工作。接下来尝试识别服务器端的瓶颈。如果没有足够的空间来调试代码,那么通过一些服务器容量规划练习,并找出如何进一步扩展硬件或将后台作业移出Web服务器以减少负载。使用这些工具捕获指标可能还不够,您可能需要对应用程序进行仪器(日志捕获)捕获其他指标才能正确监控应用程序的运行状况。
Here可以从Microsoft找到有关.net应用程序的容量规划的一些信息。
-Vinod。