【问题标题】:Should an AWS Lambda function instance in Node.js pick up another request during an async await?Node.js 中的 AWS Lambda 函数实例是否应该在异步等待期间接收另一个请求?
【发布时间】:2019-05-03 16:30:25
【问题描述】:

假设我有一个对我的 Lambda 的请求队列,在 lambda 内部可能有一个需要 500 毫秒的外部服务调用,它被包裹在 async await 中

async callSlowService(serializedObject: string) Promise<void>{
    await slowServiceClient.post(serializedObject);
}

我是否应该期望我的 Lambda 实例在等待慢速调用时从队列中提取另一个请求?我知道它还会启动新的 Lambda 实例,但这不是我在说单个实例上的交错请求。

我问是因为我认为它应该这样做,但是我正在使用睡眠功能和负载生成器进行测试,但它没有发生。我的代码实际上是这样的:

    async someCoreFunction() Promise<void>{
        // Business logic 
        console.log("Before wait");
        await sleep(2000);
        console.log("After wait");
    }
}

const sleep = (milliseconds) => {
    return new Promise(resolve => setTimeout(resolve, milliseconds))
};

虽然“等待前”和“等待后”语句之间肯定需要 2 秒,但这段时间内没有写入新日志。

【问题讨论】:

    标签: node.js aws-lambda


    【解决方案1】:

    没有。

    Lambda 即服务在很大程度上不知道您的代码在做什么。它只是接受一个请求,调用您的代码,然后等待它返回。

    我不希望 AWS 很快实现交错等功能。这将需要 lambda 运行时对代码的行为方式有充分的了解(例如,您可能在一次调用中等待两个并发的长异步调用 - 所以当您第一次等待时简单地中断是不正确的)。对于在处理程序之外使用共享范围进行常见设置/拆卸的人来说,这也将导致无穷无尽的问题。

    当您按调用和时间付费时,我并没有真正看到交错和并行处理队列之间有很大区别(lambda 原生支持);考虑到等待的时间仍然需要一些计算。如果发生交错,我希望它是 AWS 减少自身资源消耗的一种方式。

    n.b.如果您在 lambda 函数中等待很长时间,那么可能有更好的处理方式。例如,Step Functions 提供了一种很好的方式来启动和轮询长时间运行的任务。同样,在负载中使用会话变量的模式是允许长服务回调到 lambda 中而无需 lambda 空闲的好方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2018-11-13
      • 2017-07-12
      相关资源
      最近更新 更多