在asp.net-mvc中,在不影响其他用户的情况下执行昂贵操作的正确方法是什么?

大约5年前的 I asked this question左右,如何“卸载”昂贵的操作,用户不需要等待(如审核等),以便他们在前端更快地得到响应。

我现在有一个相关但不同的问题。在我的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中有最好的做法吗?

解决方法

您可以尝试组合Hangfire和SignalR。使用Hangfire启动后台作业并放弃http请求。一旦报告生成完成,请使用SignalR生成推送通知

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。

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....