缓存和压缩 - Amazon AppSync
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

缓存和压缩

Amazon AppSync的服务器端数据缓存功能使数据在高速内存缓存中可用,从而提高性能并减少延迟。这减少了直接访问数据源的需求。缓存可用于单元解析器和管道解析器。

Amazon AppSync还允许您压缩 API 响应,以便更快地加载和下载负载内容。这可能会减轻应用程序的压力,同时还可能降低数据传输费用。压缩行为是可配置的,可以自行设置。

有关在Amazon AppSync API 中定义服务器端缓存和压缩所需行为的帮助,请参阅本节。

实例类型

Amazon AppSync在与您的Amazon AppSync API 相同的Amazon账户和Amazon地区托管 Amazon f ElastiCache or Redis 实例。

ElastiCache 提供了以下适用于 Redis 实例类型:

small

1 个 vCPU、1.5 GiB 内存、低至中等网络性能

medium

2 个 vCPU、3 GiB 内存、低至中等网络性能

large

2 个 vCPU、12.3 GiB 内存、高达 10 千兆位的网络性能

xlarge

4 vCPU、25.05 GiB 内存、高达 10 千兆位的网络性能

2xlarge

8 vCPU、50.47 GiB 内存、高达 10 千兆位的网络性能

4xlarge

16 vCPU、101.38 GiB 内存、高达 10 千兆位的网络性能

8xlarge

32 vCPU、203.26 GiB 内存、万兆网络性能(并非在所有地区都可用)

12xlarge

48 vCPU、317.77 GiB 内存、万兆网络性能

注意

过去,您指定了特定的实例类型(例如t2.medium)。截至 2020 年 7 月,这些传统实例类型继续可用,但已弃用,不鼓励使用。建议您使用此处描述的通用实例类型。

缓存行为

以下是与缓存相关的行为:

None(无)

没有服务器端缓存。

完整请求缓存

如果数据不在缓存中,则从数据源检索数据并填充缓存,直到生存时间 (TTL) 到期。对你的 API 的所有后续请求都将从缓存中返回。这意味着除非 TTL 到期,否则不会直接联系数据源。在此设置中,我们使用$context.arguments$context.identity地图的内容作为缓存密钥。

每个解析程序的缓存

使用此设置时,必须明确选择每个解析器才能缓存响应。您可以在解析器上指定 TTL 和缓存密钥。您可以指定的缓存键是这些地图中的顶级地图$context.arguments$context.source$context.identity、和/或字符串字段。TTL 值是必需的,但缓存键是可选的。如果您未指定任何缓存密钥,则默认值为$context.arguments$context.source、和$context.identity地图的内容。

例如,可以使用以下组合:

  • $context.argument s 和 $conte

  • $context. arguments 和 $context.identit

  • $context.arguments.id$context. InputType.id

  • $context.source.id$context.identity

  • $context.identity.claims.user

当您仅指定 TTL 而不指定缓存密钥时,解析器的行为与完全请求缓存相同。

缓存存存时间

此设置定义了在内存中存储缓存条目的时间。最大生命周期为 3600 秒(1 小时),其后自动删除条目。

缓存加密

缓存加密有以下两种形式。这些设置类似 ElastiCache 于 Redis 允许的设置。只有在首次为Amazon AppSync API 启用缓存时,才能启用加密设置。

  • 传输中加密-缓存和数据源(不安全的 HTTP 数据源除外)之间的Amazon AppSync请求在网络级别上加密。由于在端点对数据进行加密和解密需要进行一些处理,因此传输中加密可能会影响性能。

  • 静态加密-交换操作期间从内存保存到磁盘的数据在缓存实例上加密。此设置也会影响性能。

要使缓存条目失效,您可以使用Amazon AppSync 控制台或Amazon Command Line Interface (Amazon CLI) 进行刷新缓存 API 调用。

有关更多信息,请参阅Amazon AppSync API 参考中的 ApiCacheDate 类型。

缓存驱逐

在设置Amazon AppSync服务器端缓存时,可以配置最大 TTL。该值定义了缓存条目在内存中存储的时间长度。在必须从缓存中删除特定条目的情况下,可以在解析器的请求或响应映射模板中使用Amazon AppSyncevictFromApiCache扩展实用程序。(例如,当您的数据源中的数据已更改,并且您的缓存条目现已过时。) 要从缓存中移出项目,必须知道其密钥。因此,如果您必须动态驱逐项目,我们建议使用每解析器缓存并明确定义用于向缓存中添加条目的密钥。

驱逐缓存条目

要从缓存中移出项目,请使用evictFromApiCache扩展实用程序。指定类型名称和字段名,然后提供键值项的对象来生成要移除的条目的密钥。在对象中,每个键代表来自缓存解析器cachingKey列表中使用的$context对象的有效条目。每个值都是用于构造密钥值的实际值。必须按照缓存解析器cachingKey列表中缓存键的顺序将项目放入对象中。

例如,请参阅以下架构:

type Note{ id: ID! title: String content: String! } type Query { getNote(id: ID!): Note } type Mutation { updateNote(id: ID!, content: String!): Note }

在此示例中,您可以启用每个解析器缓存,然后为getNote查询启用缓存。然后,您可以将缓存密钥配置为包括[$context.arguments.id]

当你尝试获取 a 时Note,为了构建缓存密钥,使用getNote查询的id参数在其服务器端缓存中Amazon AppSync 执行查找。

更新时Note,必须逐出特定注释的条目,以确保下一个请求从后端数据源获取该条目。为此,您必须创建请求映射模板。

以下示例说明了一种使用此方法处理驱逐的方式:

#set($cachingKeys = {}) $util.qr($cachingKeys.put("context.arguments.id", $context.arguments.id)) $extensions.evictFromApiCache("Query", "getNote", $cachingKeys) { "version" : "2017-02-28", "operation" : "UpdateItem", "key" : { "id" : "$context.arguments.id" }, "update" : { "expression" : "SET #content = :content", "expressionNames": { "#content" : "content" } "expressionValues": { ":content" : $util.dynamodb.toDynamoDBJson($context.arguments.content) } } }

或者,您也可以在响应映射模板中处理驱逐问题:

#set($cachingKeys = {}) $util.qr($cachingKeys.put("context.arguments.id", $context.arguments.id)) $extensions.evictFromApiCache("Query", "getNote", $cachingKeys) $util.toJson($context.result)

处理updateNote突变后,Amazon AppSync 会尝试驱逐该条目。如果成功清除条目,则响应在extensions对象中包含一个apiCacheEntriesDeleted值,该值显示删除了多少条目:

"extensions": { "apiCacheEntriesDeleted": 1}

根据身份逐出缓存条目

您可以根据$context对象的多个值创建缓存密钥。

例如,以下架构使用 Amazon Cognito 用户池作为默认身份验证模式,并由 Amazon DynamoDB 数据源提供支持:

type Note { id: ID! # a slug; e.g.: "my-first-note-on-graphql" title: String content: String! } type Query { getNote(id: ID!): Note } type Mutation { updateNote(id: ID!, content: String!): Note }

Note对象类型保存在一个 DynamoDB 表中。该表有一个复合密钥,它使用 Amazon Cognito 用户名作为主键,使用id(slug)Note作为分区键。这是一个多租户系统,允许多个用户托管和更新他们的私有Note对象,这些对象永远不会共享。

由于这是一个读取密集型系统,因此使用每解析器缓存来缓存getNote查询,缓存密钥由组成[$context.identity.username, $context.arguments.id]。更新后Note,您可以逐出该特定条目Note。必须按照解析器cachingKeys列表中指定的顺序在对象中添加组件。

以下示例说明了这一情况:

#set($cachingKeys = {}) $util.qr($cachingKeys.put("context.identity.username", $context.identity.username)) $util.qr($cachingKeys.put("context.arguments.id", $context.arguments.id)) $extensions.evictFromApiCache("Query", "getNote", $cachingKeys) { "version" : "2017-02-28", "operation" : "UpdateItem", "key" : { "username": "$context.identity.username", "slug" : "$context.arguments.id" }, "update" : { "expression" : "SET #content = :content", "expressionNames": { "#content" : "content" } "expressionValues": { ":content" : $util.dynamodb.toDynamoDBJson($context.arguments.content) } } }

后端系统也可以更新Note并驱逐该条目。例如,使用以下突变:

type Mutation { updateNoteFromBackend(id: ID!, content: String!, username: ID!): Note @aws_iam }

您可以逐出该条目,但要将缓存密钥的组成部分添加到cachingKeys对象。

在以下示例中,驱逐发生在解析器的响应映射模板中:

#set($cachingKeys = {}) $util.qr($cachingKeys.put("context.identity.username", $context.arguments.username)) $util.qr($cachingKeys.put("context.arguments.id", $context.arguments.id)) $extensions.evictFromApiCache("Query", "getNote", $cachingKeys) $utils.toJson($context.result)

如果您的后端数据已在外部更新Amazon AppSync,则可以通过调用使用NONE数据源的变异将项目从缓存中逐出。

压缩 API 响应

Amazon AppSync 允许客户端请求压缩的有效负载。如果收到请求,则会压缩并返回 API 响应,以响应表示首选压缩内容的请求。压缩的 API 响应加载速度更快,内容下载速度更快,您的数据传输费用也可能会降低。

注意

2020 年 6 月 1 日之后创建的所有新 API 均提供压缩功能。

Amazon AppSync 可以将 GraphQL 查询负载大小压缩介于 1000 和 10000000 0000 0000 0000 0000。要启用压缩,客户端必须发送带有值gzip或的Accept-Encoding标头br。可以通过检查响应(gzipbr)中的Content-Encoding标头值来验证压缩。

默认情况下,Amazon AppSync 控制台中的查询资源管理器会自动设置请求中的标头值。如果您执行的查询的响应足够大,则可以使用浏览器开发者工具确认压缩。