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

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

缓存和压缩

Amazon AppSync的服务器端数据缓存功能通过在高速内存缓存中提供数据来实现,从而提高性能并降低延迟。这减少了直接访问数据源的需求。缓存可用于单位解析器和流水线解析器。

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

有关定义服务器端缓存所需行为的帮助,请参阅此部分和压缩在您的Amazon AppSyncAPI。

实例类型

Amazon AppSync主机Amazon ElastiCache 对于相同的 Redis 实例Amazon账户和Amazon区域作为您的区域Amazon AppSync API。

以下 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 内存、10 千兆网络性能(并非在所有区域都提供)

12xlarge

48 个 vCPU、317.77 GiB 内存、10 千兆网络性能

注意

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

缓存行为

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

没有服务器端缓存。

完整请求缓存

如果数据不在缓存中,则从数据源中检索数据并填充缓存,直到 TTL 过期。对您的 API 的所有后续请求都将从缓存中返回。这意味着除非 TTL 过期,否则不会直接联系数据源。在此设置中,我们使用$context.arguments$context.identity映射为缓存键。

每个解析程序的缓存

使用此设置时,必须明确选择每个解析程序来缓存响应。您可以在解析程序上指定 TL 和缓存键。您可以指定的缓存密钥位于顶部-关卡地图$context.arguments$context.source, 和$context.identity,和/或来自这些的字符串字段Map。TTL 值是必需的,但缓存键是可选的。如果您不指定任何缓存键,则默认设置为$context.arguments$context.source, 和$context.identityMap。

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

  • $context.argum$context.sour

  • $context.argum$context.identity.sub

  • $context.arguments.id 要么 $context.argents。InputType.id

  • $context.source.id$context.identity.sub

  • $context.identity.claims.usern

当只指定 TTL 而没有缓存键时,解析程序的行为与完全请求缓存行为相同。

缓存期

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

缓存加密

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

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

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

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

有关更多信息,请参阅 。ApiCache中的数据类型Amazon AppSyncAPI 参考。

缓存收回

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

收回缓存条目

要从缓存中逐出项目,请使用evictFromApiCache扩展实用工具。指定类型名称和字段名称,然后提供键值项的对象以构建要逐出的条目的密钥。在对象中,每个 key 代表一个来自$context在缓存的解析器中使用的对象cachingKeylist。每个值都是用于构造密钥值的实际值。您必须按照缓存解析器中的缓存密钥相同的顺序将项目放入对象中cachingKeylist。

例如,请参阅以下架构:

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].

当你尝试得到一个Note,来生成缓存密钥,Amazon AppSync 使用在服务器端缓存中执行查找id的参数getNote查询。

在更新时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 试图驱逐该条目。如果成功清除某个条目,则响应将包含apiCacheEntriesDeleted中的值extensions对象,显示删除了多少条目:

"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. 在对象中添加组件的顺序必须与解析器中指定的顺序相同cachingKeyslist。

以下示例对此进行了介绍:

#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 字节之间。要启用压缩,客户端必须发送Accept-Encoding带有值的标头gzip要么br. 压缩可以通过检查以下方法来验证Content-Encoding响应中标头的值 (gzip要么br)。

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