AWS AppSync 解析器 Lambda 函数与 Velocity 模板语言 (VTL)

AWS AppSync Resolvers Lambda Function vs Velocity Template Language (VTL)

我一直在研究 AWS AppSync 以创建托管 GraphQL API,并将 DynamoDB 作为数据存储。我知道 AppSync 可以使用 Apache Velocity 模板语言作为解析器从 dynamoDB 获取数据。然而,这意味着我必须向编程堆栈引入一种额外的语言,所以我更愿意在 Javascript/Node.js

中编写解析器

使用 lambda 函数从 DynamoDB 获取数据有什么缺点吗?使用 VTL 而不是解析器的 lambda 的原因是什么?

使用 lambda 函数作为 AppsSync 解析器有利也有弊(但请注意,您仍然需要从 VTL 调用 lambda):

优点

  • 更易于编写和维护
  • 更强大的编组和验证请求和响应
  • 与 VTL(不支持宏)相比,常见功能可能更加枯燥
  • 更灵活的调试和日志记录
  • 更容易测试
  • 更好的工具和 linting 可用
  • 如果您需要在 DynamoDB 中支持 long 整数 table(DynamoDB 数字类型确实支持 long,但 AppSync 解析器仅支持 32 位整数。您可以绕过如果您使用 lambda,例如在通过 AppSync 解析器层传输之前将 longs 序列化为字符串) - 请参阅(当前)打开的功能请求:https://github.com/aws/aws-appsync-community/issues/21

缺点

  • 每次调用的额外延迟
  • 冷启动 = 更多的延迟(尽管如果这对您的用例来说是一个问题,通常可以通过让您的 lambda 保持温暖来最小化延迟)
  • 额外费用
  • 每个 lambda 的额外资源,耗尽了固定的 200 个限制

如果您正在执行简单的原始 DynamoDB 操作,那么值得尝试一下 VTL。 AWS 的文档对此非常有用:https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-dynamodb.html

如果您正在做任何稍微复杂的事情,例如编组字段、循环或一般的 hacky 非 DRY 代码,那么 lambda 绝对值得考虑,因为它可以提高编写和维护代码的速度,前提是您愿意table 具有额外的延迟和成本。