更可扩展的方式来编写这个Node.js逻辑,用于从谷歌云存储检索和更新CSV数据



我正在创建我的第一个Node.js REST API测试项目,该项目将获得奖品。该逻辑旨在执行以下操作:

  • 从与项目关联的谷歌云存储桶中检索CSV
  • 分析CSV
  • 找到第一行;声称";未填充
  • 更新";声称";列到";声称">
  • 覆盖Google Cloud Storage中CSV文件中的数据
  • 返回与该行关联的奖品名称

我的逻辑目前在本地工作,但我想知道是否有更好、更可扩展的方法来编写代码。我将以每天约10万用户的500/min速率限制对其进行测试,并最终通过存储在";声称";柱CSV中总共将有50万行(奖品(。

我正在使用的代码如下。任何关于使其可扩展的建议都将不胜感激!提前谢谢。

const csv = require('csv-parser');
const fs = require('fs');
const jsonexport = require('jsonexport');
const bucketName = 'MY-BUCKET';
const filename = 'MY-CSV';
const {Storage} = require('@google-cloud/storage');
const storage = new Storage({keyFilename: "MY-KEY.json"});
const myBucket = storage.bucket(bucketName);
const file = myBucket.file(filename);
let dataArray = [];
file.createReadStream()
.pipe(csv())
.on('data', function (data) {
dataArray.push(data);
})
.on('end', function(){
let prize = dataArray.find(element => element.Claimed == "");
prizeName = prize.Prize_name;
prize.Claimed = "claimed!";
jsonexport(dataArray,function(err, transformedData){
if(err) return console.log(err);
file.save(transformedData, function(err) {
if(err) return console.log(err);
});
});
return prizeName
});

好吧,我有我的经验。根据一个问题,它更多的是关于性能,我建议基本代码运行良好。

我想瓶颈是fscreateReadStream。它工作得很好,但它不是异步的(这个问题告诉我们为什么(。

实际上是,但 如果你想一次存储文件,你会用你的文件淹没你的RAM

const fs = require('fs');
const readFile = promisify(fs.readFile);
let file = await readFile(`${path_}/${file}`, {encoding: 'utf8'});

因此,即使你有10个用户为50k的文件,而不是一个用户为500k的文件。。您需要一次解析所有10个,但在同步执行时。。

好吧,你的逻辑不会像你想象的那样快10倍。

顺便说一句,如果你有另一个代码做同样的功能,但你不知道如何衡量它的性能速度,请使用这个:

console.time('benchmark_name')
/* Some action here */
console.timeEnd('benchmark_name')

我知道我的答案根本不是答案,但这就是我解决这个问题的方法,就好像我就是你

  • 删除CSV-它只会给您带来问题,尤其是当您处理100K+行时
  • 尝试云基础设施:如果您需要将数据存储在某个地方,请使用MongoDB Atlas(免费层(。也不要忘记在相关列上添加一些索引。因此,就目前而言,您根本不需要fs,而且它是流式传输的

在这种情况下,专注于Mongo Atlas只是一种选择,您可以使用Azure Cosmos DB或其他任何东西。甚至使用AWS/GCP免费层VPS并启动任何适合您需求的数据库。重点是,——逃离谷歌的床单/驱动器。

为什么要避免CSV/Google Drive?

正如你可能认为的那样,它们并没有那么糟糕,但你会问自己,如果谷歌驱动器.csv是存储数据的有效方式,为什么人们使用数据库而不是将所有信息存储在一个大的*.csv文件中?我想这个比喻是有道理的。

回到我们未来的数据库。。

现在,您只需要连接到数据库并修改它的值。您可以通过一个查询,而不是:,一次修改您需要的所有内容

let prize = dataArray.find(element => element.Claimed == "");

您不需要逐一查找每一行。这是您所询问的宝贵的可伸缩

您唯一需要的是:AWS Lambda、MongoDB Stitch/Rerealm、webhook、API来修改DB中的数据或添加到表单中(如果您的数据应通过http表单更新(。顺便说一句,如果你很害怕,还没有准备好跳过并留下Google Sheets,你可以先阅读这篇文章,然后尝试连接Google Sheets和你的数据库(在这种情况下是MongoDB,但Google Sheets支持Google Script,所以连接任何其他数据库都不会是大问题(

因此,所有这些步骤都将帮助您的应用程序更具可扩展性,正如您所要求的那样。此外,使用DB将解决数据验证等方面的任何其他问题。

作为一个相反的站点,在我的一个项目中,我依赖于一个数据源,该数据源实际上发布了一个大的*.csv表。它有多大?65K+行,并查找和更新其中的每一个值,需要7-12分钟的足智多谋时间。天哪,我多么讨厌那个家伙,他用csv而不是API端点/DB连接器。

相关内容

最新更新