有状态和无状态的 serverless 应用在处理请求或函数调用之间的数据和上下文方面有所不同。在无状态的 serverless 应用中,每个函数或服务调用独立运行,不保留来自先前交互的数据。函数仅使用提供的输入和外部存储(如数据库)处理请求,然后在任务完成后丢弃任何临时数据。相反,有状态的 serverless 应用在调用之间维护某种形式的上下文或数据,通常需要协调以跟踪跨多个请求的更改或进度。这种区别会影响开发人员如何设计可伸缩性、容错性和数据管理。
无状态 Serverless 应用优先考虑简单性和可伸缩性。例如,一个调整上传到 S3 存储桶的图像大小的 AWS Lambda 函数是无状态的:它读取输入文件、对其进行处理、将结果保存回存储,然后终止。操作完成后,函数运行时不会保留任何数据。无状态设计完全依赖于外部系统(如数据库、缓存或对象存储)来持久化数据。这种方法允许云提供商横向扩展实例——因为任何函数实例都可以处理任何请求——并简化从故障中恢复,因为没有本地状态会丢失。从数据库获取用户配置文件或验证身份验证令牌的 API 是常见的无状态用例。
有状态 Serverless 应用虽然不太常见,但它们管理持续的工作流程或用户会话。例如,跨越多个步骤(购物车更新、付款、确认)的电子商务结账流程需要跟踪订单状态。诸如 AWS Step Functions 或 Azure Durable Functions 之类的 Serverless 平台通过将状态外部化到托管服务中来实现这一点。函数本身保持无状态,但编排层(例如,Step Functions)维护进度并在步骤之间传递上下文。另一个例子是跟踪玩家位置的实时游戏后端;在这里,状态存储在快速的外部服务(如 Redis)中。虽然有状态模式增加了复杂性,但它们允许 Serverless 架构处理多步骤流程,而不会违反“无状态函数”原则。开发人员在依赖外部状态时必须仔细管理一致性和延迟。