AWS Lambda nodejs 长 运行 进程
AWS Lambda nodejs long running process
我正在做一个项目(无服务器、Lambda、Nodejs、MongoDB、SQS),我需要制作价格图表,有一个 API /api/products?country=countryCode
returns 有关产品和价格的数据(请参阅下面的回复示例),每个国家/地区的价格可能不同,例如,荷兰的价格可能是 12.99 美元,而澳大利亚的价格可能是 13.99 欧元(所有其他属性都没有变化)
我有一个 MongoDb 的国家集合,集合中大约有 225+ 个国家。我有一个每天触发一次 lambda 函数的 cron 作业。对于每个国家/地区,我需要调用 API 即 returns 需要处理的产品数据(请参阅下面的示例响应)。获取所有数据后,我同时插入产品和价格(产品是唯一的,价格计数 = 产品计数 * 国家计数 * 天数 )。为了避免国家之间的价格差异,您需要一次插入数据。例如,昨天 Bladur 之剑 的价格是 17.99 美元,今天是 18.99 美元,我们已经更新了 NL 的价格,但 AU 正在处理中。
请帮我解决其中一个问题:
问题 1(Cron -> 处理程序):1 API 请求大约需要 6-8 秒。处理所有国家,大约需要 30 (225 * 8 / 60) 分钟,但是,有一个小问题,lambda 函数有超时限制(最大:15 分钟),当然这个时间不足以完成这项工作。
问题 2(Cron -> 处理程序 -> SQS 处理程序):我重写了我的代码,而不是 运行 一个 lambda 函数,我将每个国家发送到 AWS SQS(Consumer/Producer), 它会触发一个从 API 获取数据并进行处理的 lambda 函数,但是,这里我遇到了一个问题,即我不知道循环何时结束以立即插入价格。
P.S。在我看来我应该使用 Producer/Consumer 来避免丢失国家数据,所以如果有人能解决第二个问题我会很高兴
MongoDB Product model
{
id: String,
title: String,
...
}
MongoDB Price model
{
country: String,
productId: String,
price: Number
}
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,
...
},
...
]
您是否考虑过使用 Step Functions?您可以使用一个函数来获取国家/地区列表。其结果可以传递给 map
状态,该状态将为每个国家/地区调用 lambda,获取所需的数据。完成所有这些功能后,它可以调用另一个 lambda 来执行数据库中的最终更新。
我正在做一个项目(无服务器、Lambda、Nodejs、MongoDB、SQS),我需要制作价格图表,有一个 API /api/products?country=countryCode
returns 有关产品和价格的数据(请参阅下面的回复示例),每个国家/地区的价格可能不同,例如,荷兰的价格可能是 12.99 美元,而澳大利亚的价格可能是 13.99 欧元(所有其他属性都没有变化)
我有一个 MongoDb 的国家集合,集合中大约有 225+ 个国家。我有一个每天触发一次 lambda 函数的 cron 作业。对于每个国家/地区,我需要调用 API 即 returns 需要处理的产品数据(请参阅下面的示例响应)。获取所有数据后,我同时插入产品和价格(产品是唯一的,价格计数 = 产品计数 * 国家计数 * 天数 )。为了避免国家之间的价格差异,您需要一次插入数据。例如,昨天 Bladur 之剑 的价格是 17.99 美元,今天是 18.99 美元,我们已经更新了 NL 的价格,但 AU 正在处理中。
请帮我解决其中一个问题:
问题 1(Cron -> 处理程序):1 API 请求大约需要 6-8 秒。处理所有国家,大约需要 30 (225 * 8 / 60) 分钟,但是,有一个小问题,lambda 函数有超时限制(最大:15 分钟),当然这个时间不足以完成这项工作。
问题 2(Cron -> 处理程序 -> SQS 处理程序):我重写了我的代码,而不是 运行 一个 lambda 函数,我将每个国家发送到 AWS SQS(Consumer/Producer), 它会触发一个从 API 获取数据并进行处理的 lambda 函数,但是,这里我遇到了一个问题,即我不知道循环何时结束以立即插入价格。
P.S。在我看来我应该使用 Producer/Consumer 来避免丢失国家数据,所以如果有人能解决第二个问题我会很高兴
MongoDB Product model
{
id: String,
title: String,
...
}
MongoDB Price model
{
country: String,
productId: String,
price: Number
}
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,
...
},
...
]
您是否考虑过使用 Step Functions?您可以使用一个函数来获取国家/地区列表。其结果可以传递给 map
状态,该状态将为每个国家/地区调用 lambda,获取所需的数据。完成所有这些功能后,它可以调用另一个 lambda 来执行数据库中的最终更新。