

# 了解 Lambda 编程模型
<a name="foundation-progmodel"></a>

Lambda 提供两种编程模型：最长运行 15 分钟的标准函数和最长可运行一年的持久性函数。虽然两者都具有相同的核心概念，但持久性函数还为长时间运行的有状态工作流增加了功能。

Lambda 提供了对所有运行时都通用的编程模型。该编程模型定义了代码和 Lambda 系统之间的接口。您可以通过在函数配置中定义*处理程序*来告知 Lambda 您函数的入口点。运行时将对象（例如函数名和请求 ID）传递给包含调用*事件*以及*上下文*的处理程序。

**对于持久性函数，处理程序还会收到一个 DurableContext 对象，该对象提供：**
+ 通过 step() 实现的检查点功能
+ 通过 wait() 和 waitForCallback() 进行的等待状态管理
+ 调用之间的自动状态持久性

在处理程序完成第一个事件的处理后，运行时会向处理程序发送另一个事件。对于持久性函数，处理程序可以在各步骤之间暂停执行，而 Lambda 会自动保存并在函数恢复时恢复状态。函数的类保留在内存中，因此，可以重用*初始化代码*中在处理程序方法外部声明的客户端和变量。要节省后续事件的处理时间，请在初始化期间创建可重用的资源，如 AWS 开发工具包客户端。在初始化后，函数的每个实例都可以处理数千个请求。

此外，您的函数有权访问 `/tmp` 目录中的本地存储，这是可用于多次调用的暂时性缓存。有关更多信息，请参阅 [执行环境](lambda-runtime-environment.md)。

在启用[AWS X-Ray跟踪](services-xray.md)时，运行时会单独记录初始化和执行的子分段。

运行时捕获来自函数的日志记录输出，并将它发送到 Amazon CloudWatch Logs。除了记录函数的输出外，运行时还会在函数调用开始和结束时记录条目。这包括具有请求 ID、计费持续时间、初始化持续时间和其他详细信息的报告日志。如果函数引发一个错误，则运行时会将该错误返回到调用程序。

**注意**  
日志记录受 [CloudWatch Logs 配额](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch_limits_cwl.html)的限制。由于节流或在某些情况下函数实例停止，日志数据可能会丢失。

**持久性函数的主要区别：**
+ 状态在步骤之间自动保存
+ 函数可以在不消耗资源的情况下暂停执行
+ 步骤会在失败时自动重试
+ 通过检查点跟踪进度

Lambda 通过在需求增加时运行其他实例并在需求减少时停止实例来扩展您的函数。此模型会导致应用程序架构发生变化，例如：
+ 除非另有说明，否则传入请求可能会不按次序处理或同时处理。
+ 不依赖长期存在的函数实例，而是将应用程序的状态存储在其他位置。
+ 虽然可使用本地存储和类级别对象来提高性能，但应将部署包的大小和传输到执行环境中的数据量保持在最小值。

有关您常用的编程语言中的编程模式的实际操作介绍，请参阅以下章节。
+ [使用 Node.js 构建 Lambda 函数](lambda-nodejs.md)
+ [使用 Python 构建 Lambda 函数](lambda-python.md)
+ [使用 Ruby 构建 Lambda 函数](lambda-ruby.md)
+ [使用 Java 构建 Lambda 函数](lambda-java.md)
+ [使用 Go 构建 Lambda 函数](lambda-golang.md)
+ [使用 C\$1 构建 Lambda 函数](lambda-csharp.md)
+ [使用 PowerShell 构建 Lambda 函数](lambda-powershell.md)