在异步等待期间,Node.js中的AWS Lambda函数实例是否应该接听另一个请求?

时间:2019-05-03 01:26:36

标签: node.js aws-lambda

假设我有一个Lambda请求队列,并且在lambda内部可能是一个外部服务调用,该调用需要500毫秒,它包装在异步等待中,如

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秒钟的时间,但是在这段时间内没有新的日志被写入。

1 个答案:

答案 0 :(得分:1)

否。

作为服务的Lambda基本上不知道您的代码在做什么。它只是接受一个请求,调用您的代码,然后等待它返回。

我不希望AWS会在不久的将来实现类似交错的功能。这将要求lambda运行时充分了解代码的行为方式(例如,您可能在一次调用中等待两个并发的长时间异步调用-因此,在您第一次尝试时中断只是不正确的)。对于在处理程序外部使用共享作用域进行通用设置/拆卸的人们来说,这也不会引起任何问题。

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

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