首页 > 解决方案 > 由于 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
}

在此处输入图像描述

标签: javascriptnode.jsamazon-web-servicesamazon-elastic-beanstalkcpu-usage

解决方案


根据评论。

我只能提供关于如何使用工作环境的一般描述。确切的实施细节因具体情况而异。

EB 工作环境用于执行长时间运行的任务。对于您的用例,这可能是一个很好的解决方案,因为您可以将 Web 环境与那些提升 CPU 的繁重处理工作分离。

在这种情况下,您的 Web 环境将负责启动作业并收集结果。它不会执行由专用工作环境处理的实际处理。

工作环境公开了一个 SQS 队列。这与为您提供网站 URL 的网络环境不同。从工作环境中,您只能获得 SQS 队列端点。端点用于向工作人员提交作业。您的工作应用程序将从队列中接收作业并独立于 Web 环境执行查询。

可以通过多种方式处理结果。一种方法是让工作人员将结果写入,例如 DynamoDB。在这种情况下,Web 环境会不时向数据库查询结果以检查它们何时可用。另一种方法是让您的 Web 应用程序公开一个专用的 url 端点,工作人员将调用该端点来表示作业的完成。

这就是您通常将 Web 环境与长时间运行的 cpu 或内存密集型任务分离的方式。但这需要更改您的应用程序的工作方式并开发要在 EB 工作程序环境中部署的工作程序应用程序。


推荐阅读