Node.js AWS Lambda节点长时间运行过程
我正在做一个项目(Serverless、Lambda、Nodejs、MongoDB、SQS),我需要制作一个价格表,有一个APINode.js AWS Lambda节点长时间运行过程,node.js,mongodb,amazon-web-services,serverless,timeserieschart,Node.js,Mongodb,Amazon Web Services,Serverless,Timeserieschart,我正在做一个项目(Serverless、Lambda、Nodejs、MongoDB、SQS),我需要制作一个价格表,有一个API/API/products?country=countryCode,返回有关产品和价格的数据(见下面的响应示例),每个国家的价格可能不同,例如,对于NL,价格可能是12.99美元,13.99澳元(所有其他财产不变) 我在MongoDb收集了一些国家,其中大约有225多个国家。我有一个cron作业,每天触发一次lambda函数。对于每个国家,我都需要调用API来返回需要处
/API/products?country=countryCode
,返回有关产品和价格的数据(见下面的响应示例),每个国家的价格可能不同,例如,对于NL,价格可能是12.99美元,13.99澳元(所有其他财产不变)
我在MongoDb收集了一些国家,其中大约有225多个国家。我有一个cron作业,每天触发一次lambda函数。对于每个国家,我都需要调用API来返回需要处理的产品数据(参见下面的示例响应)。获取所有数据后,我同时插入产品和价格(产品是唯一的,价格计数=产品计数*国家计数*天数)。为了避免国家之间的价格差异,您需要立即插入数据。例如,昨天Bladur剑的价格是17.99美元,今天是18.99美元,我们已经更新了NL的价格,但AU正在进行中
请帮助我解决以下问题之一:
- 问题1(Cron->Handler):1个API请求大约需要6-8秒。处理所有国家/地区需要约30(225*8/60)分钟,但有一个小问题,lambda函数有超时限制(最多15分钟),当然这段时间不足以完成任务
- 问题2(Cron->Handler->SQS Handler):我重写了代码,没有运行一个lambda函数,而是将每个国家/地区发送给AWS SQS(消费者/生产者),这会触发一个lambda函数,该函数从API和进程获取数据,在这里,我有一个问题,我不知道什么时候周期将结束插入价格一次
MongoDB Product model
{
id: String,
title: String,
...
}
API响应样本:
GET /api/products?country=NL
[
{
"id": "37071265-7f98-4e32-ae45-c23f83e7c7a2",
"title": "Dusty Book",
"country": "NL",
"price": 1299,
...
},
{
"id": "49701bcf-c076-4064-b331-0952aee21deb",
"title": "Sword of Bladur",
"country": "NL",
"price": 1799,
...
},
...
]
-----
GET /api/products?country=AU
[
{
"id": "37071265-7f98-4e32-ae45-c23f83e7c7a2",
"title": "Dusty Book",
"country": "AU",
"price": 1549,
...
},
{
"id": "49701bcf-c076-4064-b331-0952aee21deb",
"title": "Sword of Bladur",
"country": "AU",
"price": 1799,
...
},
...
]
你考虑过使用吗?您可以使用一个函数来获取国家列表。结果可以传递给
map
州,该州将为每个国家调用lambda,以获得所需的数据。一旦所有这些函数都完成,它可以调用另一个lambda来执行数据库中的最终更新。您是否可以在获取价格时将每个价格插入临时表,并在每次插入后,查看临时表中是否包含所有国家/地区,如果是,将所有内容复制到最终位置并清空临时表?看来lambda根本不适合您的用例。
GET /api/products?country=NL
[
{
"id": "37071265-7f98-4e32-ae45-c23f83e7c7a2",
"title": "Dusty Book",
"country": "NL",
"price": 1299,
...
},
{
"id": "49701bcf-c076-4064-b331-0952aee21deb",
"title": "Sword of Bladur",
"country": "NL",
"price": 1799,
...
},
...
]
-----
GET /api/products?country=AU
[
{
"id": "37071265-7f98-4e32-ae45-c23f83e7c7a2",
"title": "Dusty Book",
"country": "AU",
"price": 1549,
...
},
{
"id": "49701bcf-c076-4064-b331-0952aee21deb",
"title": "Sword of Bladur",
"country": "AU",
"price": 1799,
...
},
...
]