如何操作 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 的缓存

如何在 aws AppSync 中按 createdAt 和 updatedAt 排序和过滤?

如何通过 AWS AppSync 客户端将保存字符串的变量传递给 GraphQL 查询?