如何操作 AWS AppSync 和 GraphQL 以符合 DynamoDB 最佳实践?
Posted
技术标签:
【中文标题】如何操作 AWS AppSync 和 GraphQL 以符合 DynamoDB 最佳实践?【英文标题】:How to manipulate AWS AppSync and GraphQL to comply with DynamoDB best practices? 【发布时间】:2019-06-13 03:52:46 【问题描述】:DynamoDB 在每个应用程序使用一个表 (https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-general-nosql-design.html) 时运行效果最佳,但默认情况下 AppSync 通过从 GraphQL 架构自动生成代码的方式打破了该规则(AWS 建议用户允许 API 这样做)。因此,要在坚持 DynamoDB 最佳实践的同时使用 AppSync 和 GraphQL(假设 DynamoDB 是 GraphQL API 的唯一数据源),这种方法是否可行?
首先,创建一个空白 DynamoDB 表(本例中为TheTable
)并为其指定一个分区键(partitionKey
)和一个排序键(sortKey
)。
其次,手动强制每个 GraphQL 类型都由该表支持 (TheTable
)。这是 AppSync 自动代码生成将走向另一个方向的地方。
GraphQL 架构:
type Pineapple
partitionKey: String!
sortKey: String!
name: String!
# create varying types as long as they all map to the same table
type MachineGun
partitionKey: String!
sortKey: String!
name: String!
input CreatePineappleInput
partitionKey: String!
sortKey: String!
name: String!
type Mutation
createPineapple(input: CreatePineappleInput!): Pineapple
第三,配置您自己的解析器来处理架构(再次避免自动生成的代码):
解析器:
"version" : "2017-02-28",
"operation" : "PutItem",
"key" :
"partitionKey": $util.dynamodb.toDynamoDBJson($ctx.args.input.partitionKey),
"sortKey": $util.dynamodb.toDynamoDBJson($ctx.args.input.sortKey),
,
"attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args.input),
当我们在 AppSync 控制台中运行突变时:
GraphQL 操作:
mutation createPineapple($createPineappleInput: CreatePineappleInput!)
createPineapple(input: $createPineappleInput)
name
"createPineappleInput":
"partitionKey": "attraction123",
"sortKey": "meta",
"name": "Looking OK"
我们得到了我们希望的结果:
"data":
"createPineapple":
"name": "Looking OK"
使用 AppSync 无法实现单表效率是否有原因?
【问题讨论】:
我知道这是一个迟到的回应 - 但为了供未来的访客参考,我在这里找到了答案:github.com/aws-amplify/amplify-cli/issues/… 【参考方案1】:我不确定这个说法是否属实
DynamoDB 在每个应用程序一个表的情况下运行效果最佳
您介意分享您在哪里看到的吗? 如果表模式是基于应用程序访问模式构建的,那么 DynamoDB 确实工作得最好。这并不一定意味着您必须将所有东西都放在一张桌子上。
【讨论】:
DynamoDB 文档特别推荐了一张表 docs.aws.amazon.com/amazondynamodb/latest/developerguide/…,DynamoDB 网络研讨会详细介绍了该原则以及为什么应遵守该原则youtu.be/HaEPXoXVf2k以上是关于如何操作 AWS AppSync 和 GraphQL 以符合 DynamoDB 最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章
如何操作 AWS AppSync 和 GraphQL 以符合 DynamoDB 最佳实践?
如何在 AWS appSync 的 Apache Velocity 请求映射模板中操作字符串和数组
如何将签名的 HTTP 请求从 AWS Lambda 发送到 AppSync GraphQL?
如何使用订阅和 AWS AppSync 高效同步 Apollo 的缓存