我有一个 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/