AWS Lambda and NodeJS
Concurrency Model
NodeJS is single threaded and the event loop is the concurrency model that allows non-blocking I/O.
NodeJS EventLoop
https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
Call Stack
A simple function code is as follow:
‘Use strict’;
Function work() { console.log(‘do work’); }
Function main() { console.log(‘main start’); work(); console.log(‘main end’); }
Main();
The call stack will be empty -> main -> console/main —> main —> work/main —> console/work/main —> work/main —> main —> console/main —> main —> empty
Task Queue
Any asynchronous work in the runtime is as a task in a queue. FIFO.
When the call stack is empty and the task queue contains one or more tasks. The event loop will remove a task every tick and push in onto the call stack.
AWS Lambda
exports.handler ( event, context, callback)
Callback arguments may be used to return information to the caller and to signal that the handler function has completed so Lambda may end it.
‘use strict';
function timeout(ms) {
console.log(’timeout start’);
return new Promise(resolve => {
setTimeout(() => {
console.log(`timeout cb fire after ${ms} ms`);
resolve();
}, ms);
});
}
async function main() {
conole.log(`main start`); timeout(5e3); console.log(`main end`);
}
main();
>main start
>timeout start
>main end
>timeout cb fired after 5000ms
But if we add one line to execute in Lambda, the lambda handle that differently
exports.handler = main;
>main start
>timeout start
>main end
AWS Lambda Execution Model
Background processes or callbacks initiated by your Lambda function that did not complete when the function ended resume if AWS Lambda chooses to reuse
The Execution Context.
When the callback is called (explicitly or implicitly), AWS Lambda continues the Lambda function invocation until the event loop is empty.
So, after timeout, main event is finished, calls tack and task queue are empty. AWS lambda freeze the process.
Do it Right
You should make sure any background processes or callbacks ( in case of NodeJS ) in your code are complete before the code exits.
Change timeout(5e3); to await timeout(5e3);
function timeout(ms) {
console.log(`timeout start`);
return new Promise(resolve => {
try {
setTimeout(() => {
console.log(`timeout cb fire after ${ms} ms`);
resolve();
}, ms);
} catch(error){
reject(error);
}
});
}
async function main() {
console.log(`main start`);
await timeout(5e3);
console.log(`main end`);
}
main();
After the change, the console will be
main start
timeout start
timeout cb fire after 5000 ms
main end
There are 2 task queues.
macrotasks( e.g. setTimeout) and microtasks(e.g. Promise)
References:
https://medium.com/radient-tech-blog/aws-lambda-and-the-node-js-event-loop-864e48fba49
https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html
https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
分享到:
相关推荐
《Python库aws_cdk.aws_lambda_nodejs:构建云基础设施与Node.js函数》 在现代的IT行业中,云计算已经成为企业架构的重要组成部分。Amazon Web Services (AWS) 提供了一种强大的工具——AWS Cloud Development Kit ...
**PyPI 官网下载 | aws-cdk.aws-lambda-nodejs-1.42.1.tar.gz** 在Python开发中,PyPI(Python Package Index)是官方的第三方Python软件包仓库,开发者可以在这里发布和下载各种Python库。"aws-cdk.aws-lambda-...
**PyPI 官网下载 | aws_cdk.aws_lambda_nodejs-1.63.0-py3-none-any.whl** 这个资源是Python开发者在AWS Cloud Development Kit (CDK)框架中使用的一个组件,用于构建和部署Node.js运行时的AWS Lambda函数。AWS ...
标题中的“PyPI 官网下载 | aws_cdk.aws_lambda_nodejs-1.83.0-py3-none-any.whl”表明这是一个在Python Package Index(PyPI)上发布的软件包,具体是aws_cdk的一个子模块,用于处理AWS Lambda服务的Node.js应用。...
《Python库aws_cdk.aws_lambda_nodejs-1.80.0-py3-none-any.whl详解》 在IT行业中,Python库aws_cdk.aws_lambda_nodejs-1.80.0-py3-none-any.whl是云计算开发的重要工具,尤其对于AWS(Amazon Web Services)的使用...
λ :dashing_away: aws-lambda-nodejs-esbuild 使用构造以构建Node.js AWS lambda。 目录 特征 零配置:开箱即用,无需安装任何其他软件包 支持具有转换限制的ESNext和TypeScript语法(请参阅Note ) 注意:默认...
资源来自pypi官网。 资源全名:aws_cdk.aws_lambda_nodejs-1.80.0-py3-none-any.whl
资源来自pypi官网。 资源全名:aws_cdk.aws_lambda_nodejs-1.29.0-py3-none-any.whl
AWS Lambda,Node.js和DB(PostgreSQL)示例 最新整合 主人:主人: 通过Wercker 这是什么 以下组合的样本。 AWS Lambda Node.js PostgreSQL(pg) 吞咽 我正在尝试解决该问题,并期望它会被重用。 要求 Node.js...
LambCI 是一款持续集成系统,在AWS Lambda上构建,并且集成了 Slack 。目前已经支持大部分主流语言了,比如:C,Java,Python, Nodejs,Go,Rust,Ruby 等等。类似 Jenkins, Travis 和 CircleCI。使用效果图:特性:...
该脚本可用于脱机测试NodeJS AWS Lambda函数。指示: 在本地安装NodeJS-有关AWS中使用的当前版本,请参见此处: : 我个人使用“ n”来安装和管理多个版本的NodeJS: npm install -g nn 0.10.36根据需要安装npm模块。...
这是由Lambda节点环境中的CodePipeline触发的AWS Lambda函数。 此Lambda函数仅创建CloudFront失效,以便在再次请求边缘位置的文件时,使用最新文件来更新您的发布。 此代码不报告无效回到CodePipeline的实际状态。...
用法该软件包开箱即用可用于nodejs8.10 , nodejs10.x和nodejs12.x AWS Lambda运行时。 const chromium = require ( 'chrome-aws-lambda' ) ;exports . handler = async ( event , context , callback ) => { let ...
可本地或在AWS Lambda上运行headless" 描述了一种使用Node.js进行浏览器自动化的方法,特别强调了在Chrome的无头模式(headless mode)下运行的可能性,同时提到了能在本地环境以及AWS Lambda这种云端无服务器计算...
AWS Lambda-JavaScript ES7模板使用NodeJS进行测试,模拟事件,开发和部署到AWS Lambda的模板。 借助和此模板,您可以轻松编写ES6和ES7 JavaScript,而不必担心NodeJS版本的兼容性。例子// Native JS importimport ...
SignalFx Node.js Lambda包装器概述您可以使用此文档将SignalFx包装器添加到适用于Node.js的AWS Lambda。 SignalFx Node.js Lambda包装器包装了一个AWS Lambda Node.js函数处理程序,该功能处理程序允许将指标和跟踪...
AWS Lambda NodeJS运行时界面客户端 我们已开源了一组软件包,即运行时接口客户端(RIC),它们实现了Lambda ,使您可以无缝地将首选基础映像扩展为与Lambda兼容。 Lambda运行时界面客户端是一个轻量级的界面,允许...
测量框架仅用于在 AWS Lambda 中进行测量。仅支持 Python 和 NodeJS 作为函数运行时 测量函数的代码在code/python/. 请检查文件中的注释。 测量框架的代码在 utils.py 中。很简单。请检查文件中的注释。 ...