首页 > 解决方案 > 在 Aspnet Core 2.1 Azure App Service 中长时间运行导出到 excel 作业

问题描述

我在服务器端有一个带有 AspNetCore 2.1 Web Api 的 angular 4 应用程序(用于安静的服务)。应用程序托管在 Azure 应用服务中。应用程序具有以 excel 格式导出数据的功能。excel 中预计有超过 100k 行。Azure 应用服务的超时限制为 3.8 分钟。如果请求超过 3.8 分钟,Azure 负载均衡器将取消请求,用户经常会收到错误消息。为了解决这个问题,我决定将此任务移至后台进程,并将使用 SingalR 向用户提供更新,直到时间任务完成。申请流程如下

  1. 用户单击导出到 excel 按钮。
  2. AspNetCore API 将处理此调用并将请求放入 Azure 主题。
  3. Azure 函数将订阅 Azure 主题,一旦收到通知,它将开始处理数据。它将从 Azure SQL 获取数据。
  4. Azure 函数将定期与 SignalR 集线器讨论任务的进度。SignalR 集线器将向客户端推送通知。客户将收到此通知,用户将了解任务的进度。
  5. 数据准备好后,Azure 函数将准备 excel 并将其发送到 SignalR 集线器。SignalR 集线器会将此文件推送到客户端。

我不确定这是否是正确的方法。根据microsoft docs,应该避免长时间运行的功能。我也读过 SignalR 应该避免推送文件。

是否有更好的解决方案来实现该功能,即在后台进程中将数据导出到 excel 并在准备好后将其推送到客户端

标签: asp.net-coresignalrazure-functionsasp.net-core-webapiazure-app-service-envrmnt

解决方案


通常在这种情况下,我们会为客户提供近乎实时的解决方案。你可以做些什么来解决这个问题:

1)单击按钮以导出用户数据(具有 100K 行或更多行的 excel 文件)。

2) 通知用户,用户的导出请求已提交。

3)还添加了一个刷新按钮功能,它将获取文件导出的状态。

4)在后台有一个网络作业,它将处理您的文件并将处理后的文件上传到 azure 存储中,可能是在一个 blob 中。

5) 一旦 blob 文件可用,将状态更新为已完成。

6) 提供一个链接启用选项来下载文件,这将是你的 blob 的端点 url。

这样你的主线程就不会被锁定,屏幕也会响应。

如果您不想让刷新按钮功能继续检查报告。您可以利用 signalR 保持连接处于活动状态并设置定时选项来继续检查您的 blob 文件。一旦文件在 blob 中可用,只需更新标签。

希望能帮助到你。


推荐阅读