sql-server - 高效地动态创建 CSV 文件报告,而不会减慢 Node.js 服务器的速度

标签 sql-server node.js api csv azure

我有一个 Node.js Express API,托管在 Azure 应用服务上,提供来自 SQL Server 数据库的数据。一个新的要求是导出基于可定制数据的报告。这些应该是动态生成的 CSV 文件。

我面临的问题是,在某些情况下,CSV 文件会非常大(可能有 500,000 行)。创建这些文件对我来说并不难,然后将它们上传到 Blob 存储,或者直接将它们返回给用户。但是,正如您可以想象的那样,这会给服务器带来一些负载。此 API 每分钟处理大约 500 个 Post/Get 请求。 Node 的单线程特性意味着当有人请求这样的 CSV 文件时,服务器将会陷入爬行状态。

我需要一些关于该怎么做的建议。我的想法是在一台新服务器(可能是用 ASP.NET 编写的?)上启动一个新应用程序,负责创建 CSV 文件。它公开一个端点,该端点接收创建文件的参数,然后以文件或链接进行响应。但因为它是一个单独的服务器(如果我做了类似 .NET 的事情,也是一个单独的线程),所以在等待响应时不会减慢 Node 服务器的速度。然而,这似乎确实需要大量工作。有没有更简单的东西?我对任何可以直接连接到 SQL 数据库并生成报告的服务持开放态度(这样我就可以将其提供给客户,而不是需要硬编码的定制报告)。

最佳答案

如果您无法使用其他进程,您可以编写 CSV 生成代码,以便它使用 setImmediate 来安排分块生成。然后它将间歇性地让出,以便线程可以处理其他请求。

const chunkSize = 1000;
function generateCSV(rows, cb) {
  const csv = [];
  function handleChunk(rows, rest) {
    for (let row of rows) {
      csv.push(`${rows[i].field1},${rows[i].field2}`);
    }
    if (rest.length) {
      setImmediate(handleChunk, rest.slice(0, chunkSize), rest.slice(chunkSize));
    } else {
      cb(null, csv.join('\n'));
    }
  }
  handleChunk(rows.slice(0, chunkSize), rows.slice(chunkSize));
}

关于sql-server - 高效地动态创建 CSV 文件报告,而不会减慢 Node.js 服务器的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46213604/

相关文章:

sql-server - 获取 xml 作为 exec 存储过程的结果

c# - Entity Framework 更新/插入多个实体

javascript - 如何将闭包转换为 promise

api - 通过 HTTP 从纪元获取毫秒数

sql-server - SQL Server 到服务总线

sql-server - 由多个用户编辑数据库记录

node.js - 发现对话的开头

javascript - TypeError : driver. isElementPresent 不是函数

iphone - 适用于 iPhone 的 Deviantart API 或 SDK?

javascript - 如何更改 Facebook/twitter/youtube/Google+ Likes 按钮的图标