javascript - 由于 CPU 利用率高,Elastic Beanstalk 环境降级
问题描述
我正在尝试将一些谷歌广告帐户同步到我的系统中。
此过程从 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 使用率很高。
函数保存关键字数据
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
}
解决方案
根据评论。
我只能提供关于如何使用工作环境的一般描述。确切的实施细节因具体情况而异。
EB 工作环境用于执行长时间运行的任务。对于您的用例,这可能是一个很好的解决方案,因为您可以将 Web 环境与那些提升 CPU 的繁重处理工作分离。
在这种情况下,您的 Web 环境将负责启动作业并收集结果。它不会执行由专用工作环境处理的实际处理。
工作环境公开了一个 SQS 队列。这与为您提供网站 URL 的网络环境不同。从工作环境中,您只能获得 SQS 队列端点。端点用于向工作人员提交作业。您的工作应用程序将从队列中接收作业并独立于 Web 环境执行查询。
可以通过多种方式处理结果。一种方法是让工作人员将结果写入,例如 DynamoDB。在这种情况下,Web 环境会不时向数据库查询结果以检查它们何时可用。另一种方法是让您的 Web 应用程序公开一个专用的 url 端点,工作人员将调用该端点来表示作业的完成。
这就是您通常将 Web 环境与长时间运行的 cpu 或内存密集型任务分离的方式。但这需要更改您的应用程序的工作方式并开发要在 EB 工作程序环境中部署的工作程序应用程序。
推荐阅读
- python - 虚拟环境中的虚拟环境?
- c# - 使用 NSubstitute 检查接听电话的数量是否在范围内
- vb.net - 在 VB.NET 中,无法比较两个 Long 列表的差异
- css - 只倾斜 div 的一个角
- c# - 使用 c# LINQ 计算分组字段的平均值
- mongodb - 是否可以从嵌套在数组中的字典中进行 $lookup 查找?
- java - 如何使用按钮覆盖 TextView 中的文本?
- autodesk-forge - 如何处理来自 API 调用的“Unexpected EOF at target”错误?
- java - 服务层验证(SpringBoot)
- python - 有没有办法在 Python 中将 sqlite 查询结果导出到 csv 中