Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Configuración del almacenamiento en caché del lado del servidor y la compresión de la carga útil de la API en AWS AppSync
Gracias a las capacidades de almacenamiento en caché de datos en el servidor de AWS AppSync, los datos están disponibles en una caché en memoria de alta velocidad, lo que mejora el rendimiento y reduce la latencia. Esto reduce la necesidad de acceder directamente a los orígenes de datos. El almacenamiento en caché está disponible tanto para los solucionadores de unidades como para los de canalización.
AWS AppSync también te permite comprimir las respuestas de la API para que el contenido de la carga útil se cargue y descargue más rápido. Esto puede reducir la carga de trabajo de las aplicaciones y, al mismo tiempo, reducir los cargos por transferencia de datos. El comportamiento de la compresión es configurable y se puede ajustar según criterio propios.
Consulta esta sección si necesitas ayuda para definir el comportamiento deseado del almacenamiento en caché y la compresión del lado del servidor en tu API. AWS AppSync
Tipos de instancias
AWS AppSync aloja instancias de Amazon ElastiCache (Redis OSS) en la misma AWS cuenta y AWS región que su AWS AppSync API.
Están disponibles los siguientes tipos de instancias ElastiCache (Redis OSS):
- small
-
1 vCPU, 1,5 GiB de RAM, rendimiento de red de bajo a moderado
- medium
-
2 vCPU, 3 GiB de RAM, rendimiento de red de bajo a moderado
- large
-
2 vCPU, 12,3 GiB de RAM, rendimiento de red de hasta 10 Gigabits
- xlarge
-
4 vCPU, 25,05 GiB de RAM, rendimiento de red de hasta 10 Gigabits
- 2xlarge
-
8 vCPU, 50,47 GiB de RAM, rendimiento de red de hasta 10 Gigabits
- 4xlarge
-
16 vCPU, 101,38 GiB de RAM, rendimiento de red de hasta 10 Gigabits
- 8xlarge
-
32 vCPU, 203,26 GiB de RAM, rendimiento de red de 10 Gigabits (no disponible en todas las regiones)
- 12xlarge
-
48 vCPU, 317,77 GiB de RAM, rendimiento de red de 10 Gigabits
nota
Históricamente, se indicaba un tipo de instancia específico (por ejemplo t2.medium
). A partir de julio de 2020, estos tipos de instancias antiguas siguen estando disponibles, pero su uso está obsoleto y se desaconseja. Le recomendamos que utilice los tipos de instancia genéricos que se describen aquí.
Comportamiento del almacenamiento en caché
Los siguientes son los comportamientos relacionados con el almacenamiento en caché.
- Ninguno
-
No hay almacenamiento en caché del lado del servidor.
- Almacenamiento en caché completo de solicitudes
-
El almacenamiento en caché completo de las solicitudes es un mecanismo que almacena en caché los resultados de la ejecución de la resolución de forma individual. Con esta configuración, almacena en AWS AppSync caché la ejecución de todos los resolutores invocados durante una solicitud, y cada resolutor se almacena en caché por separado. Los datos de cada resolución se recuperan de su fuente de datos y se rellenan en la caché hasta que caduque el tiempo de vida (TTL). Para las solicitudes de API posteriores, los resultados de cada resolución específico se devuelven desde la memoria caché. Esto significa que no se contacta directamente con las fuentes de datos a menos que el TTL haya caducado. AWS AppSync utiliza el contenido de los
context.identity
mapascontext.arguments
y como claves de almacenamiento en caché para cada resolución. - Almacenamiento en caché por solucionador
-
Con esta configuración, se debe dar de alta explícitamente en cada solucionador para que almacene las respuestas en caché. Puede especificar un TTL y claves de almacenamiento en caché en el solucionador. Las claves de almacenamiento en caché que puede especificar son los mapas
context.arguments
,context.source
ycontext.identity
de nivel superior y/o los campos de cadena de esos mapas. El valor de TTL es obligatorio, pero las claves de almacenamiento en caché son opcionales. Si no especifica ninguna clave de almacenamiento en caché, los valores predeterminados son el contenido de los mapascontext.arguments
,context.source
ycontext.identity
.Por ejemplo, podría utilizar las combinaciones siguientes:
-
context.arguments y context.source
-
context.arguments y context.identity.sub
-
context.arguments.id o context.arguments. InputType.id
-
context.source.id y context.identity.sub
-
context.identity.claims.username
Si especifica solo un TTL y ninguna clave de almacenamiento en caché, el comportamiento del solucionador es el mismo que el del almacenamiento en caché completo de las solicitudes.
-
- Almacenamiento en caché a nivel de operación
-
El almacenamiento en caché a nivel de operación almacena todas las respuestas de las operaciones de consulta de GraphQL como un todo. Cuando está habilitado, las respuestas a las consultas correctas se almacenan en caché hasta que su TTL caduque, con un tamaño máximo de respuesta que se puede almacenar en caché de 15 MB. En el caso de solicitudes de consulta posteriores con la misma clave de caché, las respuestas se enviarán directamente desde la caché sin ejecutar ningún solucionador mientras el TTL no haya caducado.
La clave de caché para el almacenamiento en caché a nivel de operación se genera mediante una combinación de lo siguiente:
-
Algunos atributos de la carga útil JSON de la solicitud:
-
La cadena
query
-
La
operationName
cuerda -
¿El
variables
mapa
-
-
El
context.identity
mapa (exceptocontext.identity.sourceIp
para las solicitudes de IAM y Amazon Cognito) -
El
context.request.headers
mapa (excluyendo algunos encabezados reservados que se enumeran en la siguiente sección)
El tipo de autorización utilizado por la solicitud también afectará a la clave de caché. En el caso de las solicitudes autorizadas por IAM, la clave de caché incluirá además la lista de recursos permitidos y denegados. Para las solicitudes autorizadas por Lambda, la clave de caché incluirá además la lista de campos denegados.
La clave de caché tendrá en cuenta todos los encabezados de solicitud que se encuentren
context.request.headers
, excepto los siguientes encabezados reservados, que suelen ser exclusivos de solicitudes específicas:authorization
cloudfront-forwarded-proto
cloudfront-is-desktop-viewer
cloudfront-is-mobile-viewer
cloudfront-is-smarttv-viewer
cloudfront-is-tablet-viewer
cloudfront-viewer-asn
cloudfront-viewer-country
content-length
host
priority
sec-ch-ua
sec-ch-ua-mobile
sec-ch-ua-platform
viax-amz-cf-id
x-amz-date
x-amz-security-token
x-amzn-appsync-is-vpce-request
x-amzn-remote-ip
x-amzn-requestid
x-amzn-trace-id
x-forwarded-for
-
- Tiempo de vida en caché
-
Este ajuste define la cantidad de tiempo de almacenamiento de entradas en caché en la memoria. El TTL máximo es de 3.600 s (1 h), después de lo cual las entradas se eliminan automáticamente.
Cifrado de caché
El cifrado de caché tiene las dos versiones siguientes. Son similares a los ajustes que permite ElastiCache (Redis OSS). Puede habilitar la configuración de cifrado solo cuando habilite por primera vez el almacenamiento en caché para su AWS AppSync API.
-
Cifrado en tránsito: las solicitudes entre AWS AppSync la caché y las fuentes de datos (excepto las fuentes de datos HTTP inseguras) se cifran a nivel de red. Como se requiere cierto procesamiento para cifrar y descifrar los datos en los puntos de conexión, habilitar el cifrado en tránsito puede afectar al rendimiento.
-
Cifrado en reposo: los datos guardados en el disco desde la memoria durante las operaciones de intercambio se cifran en la instancia de la caché. Esta configuración también afecta al rendimiento.
Para invalidar las entradas de la caché, puedes realizar una llamada a la API de flush cache mediante la AWS AppSync consola o el AWS Command Line Interface ().AWS CLI
Para obtener más información, consulta el tipo de ApiCachedatos en la referencia de la AWS AppSync API.
Expulsión de caché
Al configurar el almacenamiento en caché AWS AppSync del lado del servidor, puede configurar un TTL máximo. Este valor define la cantidad de tiempo que las entradas almacenadas en caché se almacenan en la memoria. En situaciones en las que deba eliminar entradas específicas de la memoria caché, puede utilizar la utilidad AWS AppSync de evictFromApiCache
extensiones en la solicitud o respuesta del solucionador. (Por ejemplo, cuando los datos de los orígenes de datos han cambiado y la entrada de la caché ahora está obsoleta). Para expulsar un elemento de la caché, debe conocer su clave. Por este motivo, si debe expulsar los elementos de forma dinámica, le recomendamos que utilice el almacenamiento en caché por solucionador y que defina de forma explícita una clave para añadir entradas a la caché.
Expulsar una entrada en caché
Para expulsar un elemento de la caché, utilice la utilidad de extensiones evictFromApiCache
. Especifique el nombre del tipo y el nombre del campo y, a continuación, proporcione un objeto de elementos clave-valor para crear la clave de la entrada que desee expulsar. En el objeto, cada clave representa una entrada válida del objeto context
que se utiliza en la lista cachingKey
de solucionadores almacenada en caché. Cada valor es el valor real que se utiliza para crear el valor de la clave. Debe colocar los elementos del objeto en el mismo orden que las claves de almacenamiento en caché de la lista cachingKey
del solucionador almacenado en caché.
Por ejemplo, vea el esquema siguiente:
type Note { id: ID! title: String content: String! } type Query { getNote(id: ID!): Note } type Mutation { updateNote(id: ID!, content: String!): Note }
En este ejemplo, puede habilitar el almacenamiento en caché por solucionador y, a continuación, habilitarlo para la consulta getNote
. A continuación, puede configurar la clave de almacenamiento en caché para que contenga [context.arguments.id]
.
Cuando intenta obtener unaNote
, para generar la clave de caché, AWS AppSync realiza una búsqueda en su caché del lado del servidor utilizando el id
argumento de la getNote
consulta.
Al actualizar una Note
, debe expulsar la entrada de la nota específica para asegurarse de que la siguiente solicitud la obtenga del origen de datos del backend. Para ello, debe crear un controlador de solicitudes.
En el siguiente ejemplo se muestra una forma de gestionar la expulsión mediante este método:
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;
Otra opción puede consistir en gestionar la expulsión en el controlador de respuestas.
Cuando se procesa la updateNote
mutación, AWS AppSync intenta desalojar la entrada. Si una entrada se borra correctamente, la respuesta contiene un valor apiCacheEntriesDeleted
en el objeto extensions
que muestra cuántas entradas se han borrado:
"extensions": { "apiCacheEntriesDeleted": 1}
Expulsar una entrada de caché en función de su identidad
Puede crear claves de almacenamiento en caché basadas en varios valores del objeto context
.
Por ejemplo, tome el siguiente esquema que usa grupos de usuarios de Amazon Cognito como modo de autenticación predeterminado y está respaldado por un origen de datos de 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 }
Los tipos de objetos de Note
se guardan en una tabla de DynamoDB. La tabla tiene una clave compuesta que utiliza el nombre de usuario de Amazon Cognito como clave principal y el id
(un slug) de Note
como clave de partición. Se trata de un sistema de varios inquilinos que permite que varios usuarios alojen y actualicen sus objetos privados de Note
, que nunca se comparten.
Como se trata de un sistema de lectura intensiva, la consulta getNote
se almacena en caché por solucionador, con la clave de almacenamiento en caché compuesta por [context.identity.username,
context.arguments.id]
. Cuando se actualiza una Note
, puede desalojar la entrada correspondiente a esa Note
específica. Debe añadir los componentes del objeto en el mismo orden en que se especifican en la lista cachingKeys
del solucionador.
El ejemplo siguiente muestra esto:
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;
Un sistema de backend también puede actualizar la Note
y expulsar la entrada. Tomemos por ejemplo esta mutación:
type Mutation { updateNoteFromBackend(id: ID!, content: String!, username: ID!): Note @aws_iam }
Puede expulsar la entrada, pero añadir los componentes de la clave de almacenamiento en caché al objeto cachingKeys
.
En el ejemplo siguiente, la expulsión se produce en la respuesta del solucionador:
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; }
En los casos en los que los datos de backend se hayan actualizado de AWS AppSync forma externa, puede expulsar un elemento de la caché llamando a una mutación que utilice una NONE
fuente de datos.
Compresión de respuestas de API
AWS AppSync permite a los clientes solicitar cargas útiles comprimidas. Si se solicita, las respuestas de la API se comprimen y se devuelven en respuesta a solicitudes que indican que se prefiere el contenido comprimido. Las respuestas de la API comprimida se cargan más rápido, el contenido se descarga más rápido y, además, es posible que también se reduzcan los cobros por transferencia de datos.
nota
La compresión está disponible en todas las nuevas APIs creadas después del 1 de junio de 2020.
AWS AppSync comprime los objetos según el mejor esfuerzo posible. En raras ocasiones, AWS AppSync puede omitir la compresión en función de diversos factores, incluida la capacidad actual.
AWS AppSync puede comprimir tamaños de carga útil de consultas de GraphQL entre 1000 y 10 000 000 bytes. Para habilitar la compresión, un cliente debe enviar el encabezado Accept-Encoding
con el valor gzip
. La compresión se puede verificar comprobando el valor del encabezado Content-Encoding
en la respuesta (gzip
).
El explorador de consultas de la AWS AppSync consola establece automáticamente el valor del encabezado de la solicitud de forma predeterminada. Si ejecuta una consulta que tiene una respuesta lo suficientemente grande, la compresión se puede confirmar con las herramientas de desarrollo de su navegador.