AWS Lambda nodejs 长时间运行过程

问题描述

我正在处理一个项目(无服务器、Lambda、Nodejs、MongoDB、SQS),我需要在其中制作价格图表,有一个 API /api/products?country=countryCode 可返回有关产品和价格的数据(请参阅下面的回复示例),每个国家/地区的价格可能不同,例如,NL 的价格可能为 12.99 美元,AU 的价格可能为 13.99 欧元(所有其他属性不变)

我在 MongoDb 中有一个国家集合,集合中大约有 225+ 个国家。我有一个每天触发一次 lambda 函数的 cron 作业。对于每个国家/地区,我需要调用返回需要处理的产品数据(请参阅下面的示例响应)的 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 和流程中获取数据,但是,在这里我有一个问题,即我不知道周期何时结束以立即插入价格。

附言在我看来,我应该使用 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","price": 1799,...
]
-----
GET /api/products?country=AU
[
  {
    "id": "37071265-7f98-4e32-ae45-c23f83e7c7a2","country": "AU","price": 1549,...
]

解决方法

您是否考虑过使用 Step Functions?您可以使用单个函数来获取国家/地区列表。其结果可以传递到 map 状态,该状态将为每个国家/地区调用 lambda,获取所需数据。完成所有这些功能后,它可以调用另一个 lambda 来执行数据库中的最终更新。