使用AWS Lambda进行长时间轮询

时间:2019-03-12 10:43:58

标签: 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收取计算机电源使用费后,我该怎么做?

2 个答案:

答案 0 :(得分:1)

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

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

编辑

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

如果您希望获得大批量交易,可以使用SQS + Lambda w / CloudWatch + ELB,并带有上次检查的时间戳:

  1. 每隔一分钟,CloudWatch就会调用Lambda并选择需要更新的记录,并将ID放入SQS队列中。
  2. 使用ELB工作环境并消耗队列来进行更新。

这样,您几乎可以拥有无​​限的评价。或者,如果您希望降低复杂度,可以使用简单的EC2实例并手动管理实例并进行扩展。

答案 1 :(得分:0)

让“ GAME API”将统计信息推送到SQS队列会很好。

然后,使用者将长时间轮询队列并将结果保存到所需的任何位置。这有几个好处。

  1. 您可以从SQS即时获得长轮询功能(无需实施)
  2. 通过启用长时间轮询,您可以减少对游戏API的请求数量,从而也可以降低成本
  3. 您可以随时按需扩大或缩小消费者,因为SQS允许设置消息的可见性超时,所以您不会冒重复的风险

在使用者代码中将数据保存到关系数据库(如MySQL)中时,可能会导致意外问题,例如,当您有多个使用者轮询同​​一队列时,表锁定。因此,将NoSQL DB用于此类解决方案是一个好主意,因为它们在可伸缩性方面很灵活。

例如,Dynamo DB可以为表指定WCU(写入容量单位),因此可以节省成本并可以控制所提供的内容。

最后,SQS可以与Lambda函数集成在一起(作为异步Lambda调用),作为使用者,这可以确保仅在需要时才运行该函数,因为SQS在有记录要保存时会触发该函数。

因此,您的问题的答案是肯定的。使用Lambda是一个好主意,但是您应该将其与SQS队列一起使用。

我希望这会有所帮助。