本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在中配置服务器端缓存和API有效负载压缩 AWS AppSync
AWS AppSync的服务器端数据缓存功能在内存缓存中高速提供数据,从而提高性能并减少延迟。这减少了直接访问数据来源的需求。缓存适用于单位解析器和管道解析器。
AWS AppSync 还允许您压缩API响应,以便更快地加载和下载负载内容。这可能会减轻应用程序的压力,同时还可能会降低数据传输费用。压缩行为是可配置的,您可以自行决定进行设置。
有关定义服务器端缓存和压缩所需行为的帮助,请参阅本节。 AWS AppSync API
实例类型
AWS AppSync 将亚马逊 ElastiCache (RedisOSS) 实例托管在与您 AWS AppSync API相同的 AWS 账户和 AWS 区域中。
有以下 ElastiCache (RedisOSS) 实例类型可用:
- small
-
1 vCPU,1.5 GiBRAM,网络性能从低到中等
- medium
-
2 v CPU、3 GiBRAM,网络性能从低到中等
- large
-
2 v CPU、12.3 RAM GiB、高达 10 千兆位的网络性能
- xlarge
-
4 v CPU、25.05 RAM GiB、高达 10 千兆位的网络性能
- 2xlarge
-
8 v CPU、50.47 GiB RAM、高达 10 千兆位的网络性能
- 4xlarge
-
16 v CPU、101.38 GiB RAM、高达 10 千兆位的网络性能
- 8xlarge
-
32 v CPU、203.26 GiB RAM、10 GiB 网络性能(并非在所有地区都可用)
- 12xlarge
-
48 v CPU、317.77 GiB RAM、10 GiB 网络性能
注意
过去,您指定了特定的实例类型(例如 t2.medium
)。自 2020 年 7 月起,这些旧实例类型可以继续使用,但将弃用这些实例类型而不建议使用。我们建议您使用此处描述的通用实例类型。
缓存行为
以下是与缓存相关的行为:
- 无
-
没有服务器端缓存。
- 完整请求缓存
-
如果数据不在缓存中,则会从数据源中检索数据并填充缓存,直到 live (TTL) 时间到期。随后向您的所有请求API都将从缓存中返回。这意味着除非数据源TTL过期,否则不会直接联系数据源。在该设置中,我们将
context.arguments
和context.identity
映射的内容作为缓存键。 - 每个解析器的缓存
-
对于该设置,必须明确选择每个解析器以缓存响应。你可以在解析器上指定TTL和缓存密钥。您可以指定的缓存键是顶级映射
context.arguments
、context.source
和context.identity
以及/或者这些映射中的字符串字段。该TTL值是必填的,但缓存密钥是可选的。如果您未指定任何缓存键,则默认值是context.arguments
、context.source
和context.identity
映射内容。例如,您可以使用以下组合:
-
context.arguments 和 context.source
-
context.arguments 和 context.identity.sub
-
context.arguments.id 或上下文参数。 InputType.id
-
context.source.id 和 context.identity.sub
-
context.identity.claims.username
当您只指定缓存密钥而不指定缓存密钥时,解析器的行为与完全请求缓存相同。TTL
-
- 缓存生存时间
-
该设置定义在内存中存储缓存条目的时间。最大值TTL为 3,600 秒(1 小时),之后条目将被自动删除。
缓存加密
缓存加密具有以下两种形式。这些设置与 ElastiCache (RedisOSS) 允许的设置类似。只有在首次启用缓存时,才能启用加密设置 AWS AppSync API。
-
传输中的加密-缓存和数据源(不安全HTTP的数据源除外)之间的 AWS AppSync请求在网络级别进行加密。由于在终端节点中加密和解密数据需要进行一些处理,因此,传输中加密可能会影响性能。
-
静态加密 - 在交换操作期间从内存保存到磁盘的数据在缓存实例中进行加密。该设置也会影响性能。
要使缓存条目失效,您可以使用 AWS AppSync 控制台或 AWS Command Line Interface (AWS CLI) 进行刷新缓存API调用。
有关更多信息,请参阅《 AWS AppSync API参考》中的ApiCache数据类型。
缓存逐出
设置 AWS AppSync服务器端缓存时,可以配置最大值TTL。该值定义在内存中存储缓存条目的时间。在必须从缓存中删除特定条目的情况下,可以在解析器的请求或响应中使用 AWS AppSyncevictFromApiCache
扩展实用程序。(例如,如果数据来源中的数据发生变化,并且缓存条目现已过时。) 要从缓存中逐出某个项目,您必须知道该项目的键。因此,如果您必须动态逐出项目,我们建议使用每个解析器的缓存,并明确定义一个用于将条目添加到缓存的键。
逐出缓存条目
要从缓存中逐出项目,请使用 evictFromApiCache
扩展实用程序。指定类型名称和字段名称,然后提供一个键值项目对象以构建要逐出的条目的键。在该对象中,每个键表示 context
对象中的一个有效条目,该条目在缓存解析器的 cachingKey
列表中使用。每个值是用于构建键值的实际值。您必须按照与缓存解析器的 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
参数在其服务器端缓存中 AWS AppSync 执行查找。
在您更新 Note
时,您必须逐出特定注释的条目,以确保下一个请求从后端数据来源中获取该注释。为此,您必须创建一个请求处理程序。
以下示例说明了一种使用该方法处理逐出的方法:
import { util, Context } from '@aws-appsync/utils'; import { update } from '@aws-appsync/utils/dynamodb'; export function request(ctx) { extensions.evictFromApiCache('Query', 'getNote', { 'ctx.args.id': ctx.args.id }); return update({ key: { id: ctx.args.id }, update: { context: ctx.args.content } }); } export const response = (ctx) => ctx.result;
或者,您也可以在响应处理程序中处理逐出。
处理updateNote
突变后, AWS 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 用户名作为主键,并将 Note
的 id
(短标签)作为分区键。这是一个多租户系统,允许多个用户托管和更新他们的私有 Note
对象,这些对象从不进行共享。
由于这是一个读取密集型系统,因此,getNote
查询使用每个解析器的缓存进行缓存,缓存键由 [context.identity.username, context.arguments.id]
组成。在更新 Note
后,您可以逐出该特定 Note
的条目。您必须按照解析器的 cachingKeys
列表中指定的相同顺序将组件添加到对象中。
以下示例说明了这一点:
import { util, Context } from '@aws-appsync/utils'; import { update } from '@aws-appsync/utils/dynamodb'; export function request(ctx) { extensions.evictFromApiCache('Query', 'getNote', { 'ctx.identity.username': ctx.identity.username, 'ctx.args.id': ctx.args.id, }); return update({ key: { id: ctx.args.id }, update: { context: ctx.args.content } }); } export const response = (ctx) => ctx.result;
后端系统也可以更新 Note
并逐出条目。例如,采用以下变更:
type Mutation { updateNoteFromBackend(id: ID!, content: String!, username: ID!): Note @aws_iam }
您可以逐出条目,但将缓存键的组件添加到 cachingKeys
对象中。
在以下示例中,逐出是在解析器响应中进行的:
import { util, Context } from '@aws-appsync/utils'; import { update } from '@aws-appsync/utils/dynamodb'; export function request(ctx) { return update({ key: { id: ctx.args.id }, update: { context: ctx.args.content } }); } export function response(ctx) { extensions.evictFromApiCache('Query', 'getNote', { 'ctx.identity.username': ctx.args.username, 'ctx.args.id': ctx.args.id, }); return ctx.result; }
如果您的后端数据已在外部更新 AWS AppSync,则可以通过调用使用NONE
数据源的突变将项目从缓存中移出。
压缩响应 API
AWS AppSync 允许客户端请求压缩的有效负载。如果API收到请求,则会压缩响应,并根据表示首选压缩内容的请求返回响应。压缩API响应加载速度更快,内容下载速度更快,您的数据传输费用也可能会降低。
注意
2020 年 6 月 1 日之后APIs创建的所有新版本均可进行压缩。
AWS AppSync 尽力压缩对象。在极少数情况下, AWS AppSync 可能会根据各种因素(包括当前容量)跳过压缩。
AWS AppSync 可以将 GraphQL 查询有效负载大小压缩在 1,000 到 1000 万字节之间。要启用压缩,客户端必须发送具有 gzip
值的 Accept-Encoding
标头。可以检查响应 (gzip
) 中的 Content-Encoding
标头值以验证压缩。
默认情况下, AWS AppSync 控制台中的查询浏览器会自动在请求中设置标头值。如果您执行的查询具有足够大的响应,可以使用浏览器开发人员工具确认压缩。