在中配置服务器端缓存和API有效负载压缩 AWS AppSync - AWS AppSync

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

在中配置服务器端缓存和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.argumentscontext.identity 映射的内容作为缓存键。

每个解析器的缓存

对于该设置,必须明确选择每个解析器以缓存响应。你可以在解析器上指定TTL和缓存密钥。您可以指定的缓存键是顶级映射 context.argumentscontext.sourcecontext.identity 以及/或者这些映射中的字符串字段。该TTL值是必填的,但缓存密钥是可选的。如果您未指定任何缓存键,则默认值是 context.argumentscontext.sourcecontext.identity 映射内容。

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

  • context.argumentscontext.source

  • context.argumentscontext.identity.sub

  • context.arguments.id 或上下文参数。 InputType.id

  • context.source.idcontext.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 用户名作为主键,并将 Noteid(短标签)作为分区键。这是一个多租户系统,允许多个用户托管和更新他们的私有 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 控制台中的查询浏览器会自动在请求中设置标头值。如果您执行的查询具有足够大的响应,可以使用浏览器开发人员工具确认压缩。