在 Vapor 上运行的每个应用程序都由 AWS Lambda 提供支持,这使我们能够在无需考虑服务器的情况下运行代码。这种类型基础设施的最大好处之一是,它允许我们的应用程序自动扩展以满足需求,几乎不需要容量规划。
为了更好地了解使用 Lambda 可以扩展应用程序的程度,熟悉其一个核心概念 - 并发性非常重要。
根据 AWS,Lambda 中的并发性是“在任何给定时间发生的函数代码执行数量。同时执行。”因此,鉴于新 AWS 帐户的默认限制是 1,000 个并发执行,Web 应用程序可以同时处理 1,000 个请求。
这听起来很简单;但是,如果我们继续深入挖掘,就会发现更多内容。
保留并发性
AWS 应用的并发性限制在单个帐户上的所有函数之间共享。这意味着,如果帐户上的一个函数正在并发性限制下执行,则其他函数将被阻止同时执行。
为了减轻这种情况,每个单独的函数都可以从整体帐户并发性池中保留容量。例如,为了确保始终有 100 个函数准备好响应,您需要将“保留并发性”的值设置为 100。请注意,如果此函数的并发性达到保留限制,它将不会从非保留池中提取。这意味着 100 成为该函数的最大同时调用。
要在 Vapor 项目中与此设置进行交互,您可以更新 vapor.yml
文件的 concurrency
选项,以限制任何时候可以处理的 HTTP 请求数量,并且可以更新 queue-concurrency
选项以限制任何时候可以处理的排队作业数量。
未保留并发
正如你可能猜到的那样,未保留并发是任何未明确保留的剩余并发。AWS 将为所有非并发保留函数保留 100 个调用。这意味着在不请求 AWS 增加限制的情况下,只能在帐户上的所有函数中保留 900 个调用。
预置并发
在阅读有关无服务器应用程序时,你可能遇到过“冷启动”一词。冷启动是指无服务器函数执行时间比平时长。当函数处于非活动状态时会出现这种情况,因为它最近没有被执行,并且云提供商必须在函数运行之前初始化环境。函数一旦执行一次,它将保持一段时间处于预热状态,并且后续执行时间将快得多。
预置并发可以通过初始化给定数量的执行环境并使其随时准备立即响应执行请求来缓解此问题。
使用预置并发需要 成本。同样值得注意的是,预置并发计入函数的保留并发。你无法分配超过你已保留的预置并发。
要对 Vapor 项目使用预置并发,你可以更新 vapor.yml 文件的 capacity
选项。
如果你希望获得类似的功能,但不需要增加成本,你可以考虑预热,也可以从 vapor.yml 文件中进行配置。
有关在 Vapor 项目中使用此功能的更多信息,你可以访问 预置并发 和 预热 的文档。
节流
当没有足够的并发来处理所需的执行数量时,就会发生节流。例如,想象一下 Lambda 函数上的保留并发设置为 10,并且当作业添加到 SQS 队列时触发该 Lambda 函数。如果该队列同时添加了 10 个或更多作业,则没有足够的并发来处理所有作业,并且未处理的作业最终会返回队列。
节流的影响取决于函数的使用方式。在 Vapor 的情况下,这可以是三件事之一
- HTTP 请求 - 当请求到达 API 网关或应用程序负载均衡器时,它会将请求发送到 Lambda 进行处理。如果 Lambda 调用被节流,你的 API 将返回错误响应。
- 排队作业 - Vapor 配置 SQS 在作业添加到队列时触发 Lambda 函数。如果 Lambda 调用被节流,作业将被添加回队列。
- CLI - 命令和计划任务由 Lambda 处理。如果调用受到限制,命令将失败。
监控
AWS 控制台有一些出色的监控工具,可让你查看 Vapor 应用程序的运行状况。要深入了解,请登录 AWS > 导航到 Lambda 服务 > 单击相关功能 > 单击“监视”选项卡。
此仪表板提供了多种指标,可帮助你监控你的环境,例如调用日志、显示成功调用、受限调用和返回错误的调用的图表。
管理并发
如果你注意到你的 Lambda 函数经常受到限制,可能是时候考虑调整你的配置了。如果帐户上的另一个函数主导调用,则可以限制其并发性,以释放未保留的池,供那些受限的函数使用。你可以考虑保留受限函数的某些并发性,以确保它始终具有运行所需的容量。最后,如果你已用尽所有选项来成功共享帐户上的并发池,则可以联系 AWS 并要求扩展你的池。根据 文档,1,000 个并发调用限制是一个软限制,可以增加到“数万”。