node.js - 使用 AWS Lambda 进行长轮询

标签 node.js amazon-web-services aws-lambda

我正在为外部 API 创建一个监控系统,如果响应与初始请求不同,我需要在该系统上调用一个函数。

目前没有对我的函数进行任何长时间的轮询,我得到了以下信息:

  let gameAPI = new game(
      [
        "email@email.com",
        "password",
        "secret",
        "secret"
      ]
  );


  let lastModified;

  gameAPI.login().then(() => {

      gameAPI.getProfileStats(process.argv[2], process.argv[3], process.argv[4]).then(stats => {
          //first run grab this only
          if(lastModified < stats.data.lastModified) {
              //we found new data, stop polling & update mySQL database.
          } else {
              //continue to run every 1 minute...
          }
      });

  });

AWS Lambda 会是这个理论的一个很好的解决方案吗?如果是这样,我将如何着手去做,因为 Lambda 对计算机用电量收费?

最佳答案

不绝对不是一个好主意,在这种情况下,您不会让 Lambda 函数退出,并且您会持续付费。最重要的是,Lambda 的最长执行时间为 15 分钟,因此您需要以某种方式经常触发它。

一种可行的方法仍然是使用 Lambda,但不是继续运行,而是在 else 语句处退出,并使用 CloudWatch 触发器每分钟调用一次您的函数,这样您就可以每分钟运行一次检查,但仅在您的检查功能执行期间收费。

编辑

如果要监控的用户很多,则取决于实际数量,一个简单的解决方案是让 EC2 拥有一个长生命周期的进程,并将 Last Checked 时间戳存储在数据库中。对于每个时间段(比如 1 分钟),为上次更新的项目选择数据库 > 1 分钟前,并存储在该本地进程中的队列中。在此过程中,以一定的速率(例如 1/秒)执行您的获取和检查逻辑,并更新数据和上次在数据库中检查。

如果您期望大容量,您可以使用 SQS + Lambda w/CloudWatch + ELB,以及上次检查的时间戳:

  1. 每分钟,CloudWatch 都会调用 Lambda 并选择需要更新的记录,并将 ID 放入 SQS 队列中。
  2. 使用 ELB worker 环境并使用队列进行更新。

那样的话,您几乎可以享受无限的速度。或者,如果您希望稍微降低复杂性,您可以使用简单的 EC2 实例并手动管理实例和扩展。

关于node.js - 使用 AWS Lambda 进行长轮询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55119544/

相关文章:

amazon-web-services - 使用目标触发器从 Lambda 到 SQS 的多条消息

python - AWS Lambda : How to manage deployment packages greater than 250mb

python - 如何在 AWS RDS 中查看数据库的内容?

amazon-web-services - 如何在 terraform 中的嵌套 block 内循环

node.js - 如何在expressjs上将API(路由)转换为CLI

javascript - 仅接受 socket.io 中客户端发出的第一个事件并丢弃重复事件

javascript - AWS Lambda 不等待来自 DynamoDB 的 Promise.all()

javascript - 如何将签名的 HTTP 请求从 AWS Lambda 发送到 AppSync GraphQL?

node.js - Mongoose 模型 - 包括 GridFS 图像引用

Javascript/Node - 使用 for 循环将对象插入数组