首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >异步和分析的故障

异步和分析的故障
EN

Stack Overflow用户
提问于 2018-08-14 01:33:38
回答 1查看 718关注 0票数 1

我使用的是Parse,异步函数不像预期的那样有问题。我在AWS上的Node.js 8.10上运行这个。下面是我的函数的一个(非常简化的)版本:

代码语言:javascript
运行
复制
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正在提前终止该进程。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-20 00:15:09

我已经解释了为什么它不是一个bug,它是由设计和故意的。因此,您可以在httpRequest超时的情况下运行更长时间。

如果您查看代码这里,您将看到handleCloudJob()函数的长度很长,从而将作业执行与请求生命周期隔离开来。这是故意的,而不是错误。

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

  1. 请求来了
  2. handleCloudJob()被调用
  3. 作业设置为正在运行
  4. 我们调用process.nextTick()来使作业有效地工作排队
  5. 我们返回作业状态ID。
  6. 响应与jobID一起发送。
  7. 作业开始了,process.nextTick排队……时间过去了
  8. 工作结束了
  9. jobStatus获取已更新

现在想象一下我们没有那么做:

如果不是6,而是发出回复,我们在工作中“等待”,就像你说的

会发生的情况是:

  • 套接字的超时可能会达到(30),因为作业是“长”的。
  • 连接将被关闭
  • 不可能拿到工作证明。

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

  • 排队在第4步完成,
  • 在步骤6中,发送响应。
  • 响应被发送到客户端。
  • 兰巴达的环境被破坏了。

这就是人们所期望的行为。

还能更好吗?也许,但这需要一个完全不同的作业执行环境。基本上是等待在后台执行很长时间的功能的消息的工作人员(所以不是前端lambdas)。

在lambdas的常见问题,它是说,默认超时时间为3s。和可以扩展到最大300 s。因此,默认情况下,lambda不适合运行作业。

虽然我理解你的挫折感,这对“你”没有任何意义,但这都是故意的。

即使我们在解析服务器上交换了实现,它也不适合lambda运行作业。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51832572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档