异步和解析麻烦

时间:2018-08-14 01:33:39

标签: node.js parse-platform aws-lambda

我正在使用Parse Server并遇到异步功能无法按预期运行的问题。我正在AWS Lambda的Node.js 8.10上运行它。这是我的功能的一个(非常简化的)版本:

Parse.Cloud.job("updateSubscriptions", async (req, res) => {
  try {
    winston.info("Updating subscriptions...");

    var Subscription = Parse.Object.extend("Subscription");
    var query = new Parse.Query(Subscription);

    await query.find().then(
      function () {
        winston.debug("Got subscriptions.");
      },
      function(error) {
        winston.error("Error querying subscriptions.");
      }
    );
    winston.debug("Wrapping up.");
  } catch (e) {
    winston.error("Uh oh.");
  }
});

我想要(并期望)得到输出“正在更新订阅...已得到订阅。结束。”

实际上发生的是,我看到“正在更新订阅...”,仅此而已。看来该函数实际上并没有在等待异步调用,并且/或者Lambda正在尽早取消该进程。

有人知道我在做什么错吗?

1 个答案:

答案 0 :(得分:2)

我已经解释了为什么它不是故意造成的错误。因此,您可以将运行的时间延长到httpRequest超时之前。

如果看一下代码here,您会发现handleCloudJob()函数的作用很长,可以将作业执行与请求生命周期隔离开。这是按设计没有错误

现在,让我们看看它在lambda中如何工作:

  1. 请求进入
  2. handleCloudJob()被称为
  3. 作业设置为running
  4. 我们调用process.nextTick()来排队工作有效的工作
  5. 我们返回工作状态ID。
  6. 响应与jobID一起发送
  7. 工作开始,由process.nextTick排队 ...>时间流逝
  8. 工作完成
  9. jobStatus获得updated

现在想象一下,我们没有这样做:

at if而不是6。发送答复,我们正在“等待”工作,就像您建议的那样

会发生什么:

  • 由于作业很长,套接字可能超时(30s)
  • 连接将关闭
  • 无法获得工作ID。

现在在您的lambda环境中会发生什么:

  • 在第4步完成排队
  • 在步骤6中,发送响应
  • 响应发送给客户端
  • lambda环境被破坏。

这是预期的行为。

会更好吗?也许可以,但是这需要完全不同的作业执行环境。基本上是等待在后台执行长时间功能的消息的工作程序(因此不是前端lambda)

在lambdas常见问题解答中指出default timeout is 3s,并且可以扩展到最大300s。因此,默认情况下,lambda不适合运行作业。

虽然我了解您的无奈,并且对“您”没有任何意义,但这全是设计使然。

即使我们在parse-server上交换了实现,也不会适合lambda运行作业。