【问题标题】:Is a shadow launch in AWS Lambda possible?是否可以在 AWS Lambda 中进行影子启动?
【发布时间】:2020-05-16 00:10:57
【问题描述】:

什么是影子发射?

影子发布意味着您启动了新版本,但尚未获得实时流量。旧版本的流量会 1:1 复制到新版本中,因此您可以在不影响实时系统的情况下衡量新功能与旧功能的性能和结果。

尝试过的方法

我已经尝试使用“代理”函数自己构建类似的东西,该函数异步调用新函数并转储结果,同步调用旧函数返回其结果。

问题是副作用:如果两个函数都做某事,例如在 DynamoDB 中,由于影子启动,数据库中可能存在无效状态。

目标

我想测试特定 lambda 函数的新代码版本。

预期使用示例

我有一个函数可以计算斐波那契 recursive 并将结果与​​时间戳一起存储在我的实时系统中的 DynamoDB 中。

这个函数是通过AWS Step Functions 调用的。

因为计算它应该更有效iterative 我用这个新算法实现了这个函数。

现在我想测试新功能比旧功能性能更高的假设。 所以我影子部署它 AWS lambda 以获得实际的实时流量作为测试数据。

问题

使用当前工具,我发现只能执行两次该函数,从而在 DynamoDB 中创建两个条目,我认为这是不希望的副作用,因为我在 DynamoDB 中的数据处于意外的无效状态。

如果我在新函数中模拟外部服务,它可能总是比旧的性能更好,因为无法访问耗时的外部服务,因此我的结果会不正确。

问题

是否可以在没有这些副作用的情况下影子启动新版本的 AWS lambda 函数?

【问题讨论】:

  • 您能否详细说明一下,您想在这里实现什么,与 prod 版本相比,您想在这个“影子”版本中测试什么?可能有不同的方法,而不是从一个复制到另一个。
  • 添加了更多上下文和具体示例
  • 您在 AWS 上只有一个生产数据库?
  • 你的 lambda 函数是如何获得流量的?例如:api-gateway 或具有不同的服务事件?
  • lambda 函数从 AWS Step Functions 中链接并从那里获取流量

标签: amazon-web-services aws-lambda aws-sdk aws-sdk-js


【解决方案1】:

我认为您可以使用 Lambda 别名和路由配置将一部分流量发送到第二个函数版本。基本上,事件源现在使用函数的别名 ARN 进行映射,然后您可以配置流量权重以通过当前版本路由其中的大部分,而其他 % 使用新版本。

文档中的一些信息和示例:

https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html

【讨论】:

  • 我知道这一点,但那是所谓的“金丝雀发射”,而不是我打算实施的影子发射。部分发送流量不是问题,1:1 复制及其副作用是困难的部分
【解决方案2】:

您可以使用单个 Lambda 将事件发送到 AWS SNS,后者将事件分发到不同的 SQS 队列。然后您的旧版本和新版本处理不同的 SQS 队列,但这些事件完全相同。

【讨论】:

  • 会起作用,但仍然存在问题中所述的副作用问题
  • @SimonFrey 那么为什么不让每个 lambda 写入不同的发电机表呢?如果它们同时运行并写入同一张表 - 当然你会有那些“副作用”。
  • @LLL 是的,可能是需要不同数据库的唯一解决方案
【解决方案3】:

您提到您使用 CloudFront,因此一个不错的选择可能是对 CloudFront 请求使用 Lambda@Edge 函数。

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-examples.html#lambda-examples-a-b-testing

基本上,您可以在每次收到 CloudFront 请求时执行一些代码。我发送的链接是关于 A/B 测试的,这意味着您选择向实例 A 或 B 发送请求。但是没有什么可以阻止您向 A 和 B 发送请求。

这对用户来说是完全透明的。您可以部署两个版本,同时执行两个版本(或按一定比例执行),用户体验将是相同的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    相关资源
    最近更新 更多