我们使用机器学习技术将英文博客翻译为简体中文。您可以点击导航栏中的“中文(简体)”切换到英文版本。
使用 亚马逊云科技 Lambda 预留并发实现无服务器分层策略
作者:亚马逊云科技 高级合作伙伴解决方案架构师 Lal Verma
预留并发性是
在这篇文章中,我将探讨如何利用此功能为多租户软件即服务 (SaaS) 应用程序定义分层策略,并演示实现示例。
使用 亚马逊云科技 Lambda 函数有很多好处。从 SaaS(以及一般而言)中的无服务器模式开始,通过简化架构和运营占用空间来消除无差别的繁重工作。
请注意,如果这是您第一次在亚马逊网络服务 (亚马逊云科技) 上遇到无服务器 SaaS,请查看此博客文章以帮助提供更多背景信息:
有了这个,让我们重点关注预留并发可以为你的 SaaS 应用程序提供帮助的问题领域。
SaaS 亚马逊云科技 中的分层策略
让我们从一个例子开始:SaaS提供商A正在托管一个电子商务平台。租户之一Tenant-M通过该平台销售手机。一些型号立即变得很受欢迎,流量很高,但Tenant-M却遇到了订单失败的情况。
租户已将问题上报给SaaS提供商。在调查该问题时,他们发现由多个租户共享的计算容量不足以满足所有请求。
SaaS提供商还观察到,与其他租户相比,Tenant-M需要的容量要多得多,这也影响了其他租户的性能。这是SaaS应用程序的常见问题领域,也被称为 “邻居噪音” 的情况。
定义分层策略有助于解决这个问题。例如,SaaS提供商可以为要求更高的租户(例如Tenant-M)定义白金级别。它可以向此类租户收取更高的价格,以换取投入更高的计算容量、更高的存储容量或其他资源( 图 1 说明了这种模式)。
图 1 — SaaS 中的分层策略。
那么它是如何工作的?如果我们将讨论范围限于计算,并且 SaaS 应用程序基于
如果您使用的是
在这种情况下,预留并发提供了实施分层策略的方法。这样,您就可以为白金级租户提供专用的计算容量,而无需管理底层资源。
使用预留并发的分层策略
调用 Lambda 函数时,Lambda 服务会分配一个计算实例,该函数在其中运行和处理事件。如果在第一个 Lambda 函数仍在运行时再次调用该函数,则会分配另一个实例,这会增加该函数的并发性。
您账户在同一 亚马逊云科技 区域中所有没有预留并发的函数共享 非预留 并发池。 如果没有预留的并发性,其他函数可能会耗尽所有可用的并发性。可以将预留并发应用于函数,以保证在任何时间点有最大数量的并发函数实例。
因此,如果您有一个 “订单处理” Lambda 函数,并且将其的 “预留并发” 设置为 100,Lambda 将确保您的 100 个并发请求始终可以得到满足,无论其他函数的活动如何。定义并发限制没有成本。您只需为实际处理的请求付费。
您可以扩展此功能,为白金租户创建专用函数定义,并将预留并发与之关联起来。例如,如果函数名称为 “订单处理函数”,则可以将 Tenant-M 单独定义为 “Tenant-m-Order-Processing-function”,保留并发性。
您可以根据租户需求和定价设置预留的并发值。你也可以为所有其他函数实现这一点。对于每个白金租户,你可以借助这种方法创建专用计算。
图 2 说明了将预留并发应用于租户 PT1 和租户 PT2 的所有功能的实现。
图 2 — 采用预留并发的分层策略。
在定义分层策略时,您必须了解一些事实,以帮助您更好地进行规划。第一个是 Lambda 函数的 “
要考虑的另一件事是 “并发上限”。如果任何租户的请求负载增加到超出限制,则请求将自动受到限制。如果租户要求更多,这可能会限制执行次数。如果是这种情况,你可以将租户移至更高的等级,也可以提高分配的层级本身的上限。
另一方面,这可以为您的多租户系统提供额外的优势。由于请求的自动限制,吵闹的邻居情况将完全由您控制。
有关预留并发功能的更多详细信息,您可以查看 亚马逊云科技 Lambda 开发者指南中提供的 “
使用 亚马逊云科技 Lambda 预留并发实现分层
在示例实现中,为白金租户创建了专用计算空间。该解决方案是作为 亚马逊云科技 SaaS 工厂团队 构建的
为了设置正确的上下文,让我们首先概述一下参考解决方案。
该解决方案涵盖了广泛的多租户注意事项,包括入职和身份、租户和用户管理、身份验证和授权、数据分区、租户隔离、自动部署以及多租户可观察性。
图 3 — 无服务器 SaaS 参考架构
在预留并发的帮助下,分层策略的端到端实施可以分三个步骤来制定:
- 创建函数和 API: 这将确保为白金租户创建 Lambda 函数和 API 定义(API 网关)。
- 实现租户特定路由: 这将确保白金租户请求被路由到租户特定的资源。
- 实施租户特定策略: 这将确保租户的特定功能受到保护,免受未经授权的访问。
创建函数和 API
作为电子商务 SaaS 解决方案的一部分,该参考解决方案实现了样品订单服务和产品服务。这些服务基于 Lambda 函数。例如,订单服务由 Lambda 函数组成,例如 O rderCreateFunction、orderGetFunction、OrderDeleteFunction。
在参考解决方案中,租户配置基于 CloudFormation 模板(更具体地说是
以下是该模板的摘录,代表了 get OrdersFunction 的函数定义:
正如上面的代码所强调的,该函数的 res ervedConcurrentExecutions 属性负责为函数提供保留的并发 性。并发限制值是在 LambdaReserveConcurrency 属性的帮助下传递的,该属性 是可配置的。
可以采用类似的方法为所有其他 lambda 函数定义保留的并发值,包括 getOrderFunction、createOrderFunction 和 updateOrderFunct ion。 有关所有示例函数的定义,您可以在 Github 上查看完整的模板代码。
请注意,在上述解决方案中,预留并发属性是在 CloudFormation 模板的帮助下更新的,但您可以使用其他方式实现此目的,例如 亚马逊云科技 管理控制台
实现租户专属路由
现在这些功能已经实现,您需要确保将白金租户用户正确地路由到他们各自的职能部门。
你需要做的第一件事是创建 API 定义。我们将使用 Amazon API Gateway,这是一项完全托管的服务,可以轻松发布、维护、监控和保护任何规模的 API。
在参考解决方案中,再次使用CloudFormation模板 “tenant-template.yaml” 作为 API 定义。创建白金租户 API 定义后,CodePipeline 将使用相应的 API 网关 URL 更新租户详细信息(代表租户元数据的 DynamoDB 表)。
可以在客户端引用此 URL,以便于特定租户的路由。在参考解决方案中,示例用户界面 (UI) 是一个基于 Angular JS 的 Web 界面。名为 authConfigurationService (auth-configurat ion-service.ts)的组件负责设置租户特定的配置。
当用户登录时,这会从 DynamoDB 表中获取租户元数据,并将 API 网关 URL 设置为 “本地存储” 属性之一。这可确保将所有白金用户请求路由到正确的 API 和 Lambda 函数。你可以在
实施租户专属政策
租户特定的路由不足以确保租户的完全隔离。您还需要确保制定了安全策略,以使租户 A 的用户无法访问属于租户 B 的 Lambda 函数。
图 4 — 基于 IAM 策略的用户授权
在参考解决方案中,这项检查是在 Amazon Cognito、IAM 和 API Gateway 的帮助下实现的,后者可以验证所有 API 的授权请求。它在自定义授权器的帮助下完成此操作 ,
结论
在无服务器 SaaS 应用程序中,亚马逊云科技 lambda 提供弹性计算资源,您无需担心底层基础设施的运营和扩展方面,同时不限制您定义专用的计算资源或租户。
预留并发为隔离计算资源和定义分层策略提供了一种强大而简洁的方法。
在启用预留并发时,必须确保分配足够的并发配额以满足您的应用程序需求。此外,由于预留并发具有上限,因此您应根据租户需求和定价策略来决定其价值。
在这篇文章中,我简要介绍了示例实现。涉及多个步骤,每个步骤都很难完整地介绍。为了更深入地了解,你可以参考
关于 亚马逊云科技 软件即服务工厂
我们鼓励 SaaS 构建者联系他们的客户代表,询问参与模式,并与 亚马逊云科技 SaaS Factory 团队合作。
*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。