【问题标题】:Long running export to excel job in Aspnet Core 2.1 Azure App Service在 Aspnet Core 2.1 Azure App Service 中长时间运行导出到 excel 作业
【发布时间】:2019-07-14 11:45:20
【问题描述】:

我在服务器端有一个带有 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-core signalr azure-functions asp.net-core-webapi azure-app-service-envrmnt


    【解决方案1】:

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

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

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

    3) 还添加了刷新按钮功能,可以获取文件导出的状态。

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

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

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

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

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

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      将数据导出到后台进程中的excel,并在准备好后将其推送到客户端

      您可以尝试使用azure webjob to run in background and continuouslyAzure Batch Service,这样您就可以长时间运行将数据导出到excel 并将其存储在Storage blob 中。

      当网站运行时,相关的作业也在运行。您可以在 webjob 中使用 queueTrigger 或 httpTrigger,并从网站调用 webjob。一般来说,我们必须强制 Azure 网站始终开启。转到 Azure 网站应用程序设置并打开Always On

      正如您所指出的:SignalR 用于实时消息传递而不是上传文件。所以你可以使用WebClient.UploadFile方法将文件上传到客户端。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-01
        • 2023-03-27
        • 1970-01-01
        • 2021-11-30
        • 2017-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多