Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js AWS Lambda节点长时间运行过程_Node.js_Mongodb_Amazon Web Services_Serverless_Timeserieschart - Fatal编程技术网

Node.js AWS Lambda节点长时间运行过程

Node.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来返回需要处

我正在做一个项目(Serverless、Lambda、Nodejs、MongoDB、SQS),我需要制作一个价格表,有一个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,
    ...
  },
  ...
]