【发布时间】:2020-11-20 22:44:33
【问题描述】:
我正在尝试将一些谷歌广告帐户同步到我的系统中。
此过程从 2017 年 1 月 1 日到最后日期的谷歌广告帐户中提取数据。
查询单个日期,在 for 循环中处理它以生成正确的对象
正在插入数据库。
还尝试使用负载平衡器。但降级发生在一个实例中。
代码
查询谷歌广告数据
var difference = dateDiffInDays(new Date(2017, 0, 1), new Date());
// getting last N days
days = LastNDays(difference + 1)
// making array of date ranges
var result = days.chunk(20);
// querying google ads data
for (var value of result) {
const list = await customer.report({
entity: 'keyword_view',
attributes: adAttributes,
segments: ['segments.date'],
from_date: value[0],
to_date: value[value.length - 1]
})
await saveKeywordsData(list, value[value.length - 1])
}
我认为问题在于以下功能。
因为上述查询的输出超过 5000 或 6000(对于单个日期。这里调用日期为 2017-01-01)。
因此,在一段时间内连续处理超过 5000 个数据时会导致 CPU 使用率很高。
函数 saveKeywordsData
async function saveKeywordsData(list, cronUntill) {
let metricsArray = []
for await (let element of list) {
let metrics = element.metrics
metrics.criterion_id = element.ad_group_criterion.criterion_id
metrics.keyword = element.ad_group_criterion.keyword.text
metrics.accId = accId
metrics.agencyId = agencyId
metrics.accountMId = accountMId
metrics.date = element.segments.date
metrics.dateTime = new Date(element.segments.date)
metrics.createdAt = new Date()
metricsArray.push(metrics);
}
// metricsArray length may be more than 5000 for each loop
await chunkInsertion(metricsArray, 'keywords')
return 1;
};
函数块插入
async function chunkInsertion(metricsArray, type) {
let model
if (type == 'ads')
model = app.models.googleAdsInsights
else
model = app.models.googleAdsAuctionInsights
var data = metricsArray.chunk(50);
for (let item of data) {
await model.create(item)
}
return 1
}
【问题讨论】:
-
你能把那些繁重的处理应用程序卸载到专用的工作环境吗?
-
让我看看这个方法。 U的意思是,将web服务器环境更改为worker环境?
-
您可以为您的应用程序的网站部分保留 Web 服务器环境。 Worker env 将用于处理那些长时间运行的 heave 查询。这将需要对您的架构进行一些更改,因为 Web 和工作环境需要交互。如果您经常运行如此繁重的查询,可能更容易转移到更好的实例并首先检查这是否有帮助?
-
我认为这个 for 循环会导致这个问题。
-
@Marcin 你能解释一下怎么做吗?
标签: javascript node.js amazon-web-services amazon-elastic-beanstalk cpu-usage