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.
Uso de suscripciones para aplicaciones de datos en tiempo real en AWS AppSync
importante
A partir del 13 de marzo de 2025, podrás crear una PubSub API en tiempo real basada en AWS AppSync eventos. WebSockets Para obtener más información, consulta la sección Publicar eventos a través WebSocket de la Guía para desarrolladores de AWS AppSync eventos.
AWS AppSyncle permite utilizar las suscripciones para implementar actualizaciones de aplicaciones en tiempo real, notificaciones push, etc. Cuando los clientes invocan las operaciones de suscripción de GraphQL, automáticamente se establece y mantiene una WebSocket conexión segura. AWS AppSync De este modo, las aplicaciones pueden distribuir los datos en tiempo real desde una fuente de datos a los suscriptores y, al mismo tiempo, gestionar de AWS AppSync forma continua los requisitos de conexión y escalado de la aplicación. En las siguientes secciones se muestra cómo AWS AppSync funcionan las suscripciones.
Directivas de suscripción del esquema de GraphQL
Las suscripciones AWS AppSync se invocan como respuesta a una mutación. Esto significa que puedes crear cualquier fuente de datos en tiempo AWS AppSync real especificando una directiva de esquema de GraphQL sobre una mutación.
Las bibliotecas AWS Amplify cliente gestionan automáticamente la gestión de las conexiones por suscripción. Las bibliotecas utilizan pure WebSockets como protocolo de red entre el cliente y el servicio.
nota
Para controlar la autorización en el momento de conectarse a una suscripción, puede utilizar AWS Identity and Access Management (IAM) AWS Lambda, los grupos de identidades de Amazon Cognito o los grupos de usuarios de Amazon Cognito para la autorización a nivel de campo. Para controlar el acceso de forma más precisa a las suscripciones, puede adjuntar elementos de resolución a los campos de la suscripción y ejecutar la lógica utilizando la identidad de la persona que llama y las fuentes de datos. AWS AppSync Para obtener más información, consulte Configuración de la autorización y la autenticación para proteger las API de GraphQL.
Las suscripciones se activan a partir de mutaciones y el conjunto de mutaciones seleccionado se envía a los suscriptores.
En el siguiente ejemplo se muestra cómo usar las suscripciones de GraphQL. No especifica una fuente de datos porque la fuente de datos puede ser Lambda, Amazon DynamoDB o Amazon Service. OpenSearch
Para comenzar a utilizar las suscripciones, debe agregar un punto de entrada de la suscripción a su esquema de este modo:
schema { query: Query mutation: Mutation subscription: Subscription }
Imagine que dispone de un sitio donde se publican blogs y que desea suscribirse a nuevos blogs y a los cambios en los blogs existentes. Para ello, puede añadir la siguiente definición Subscription a su esquema:
type Subscription { addedPost: Post updatedPost: Post deletedPost: Post }
Imagine también que tiene las siguientes mutaciones:
type Mutation { addPost(id: ID! author: String! title: String content: String url: String): Post! updatePost(id: ID! author: String! title: String content: String url: String ups: Int! downs: Int! expectedVersion: Int!): Post! deletePost(id: ID!): Post! }
Puede convertir estos campos a tiempo real añadiendo una directiva @aws_subscribe(mutations:
["mutation_field_1", "mutation_field_2"]) para cada una de las suscripciones de las que desea recibir notificaciones, tal y como se indica a continuación:
type Subscription { addedPost: Post @aws_subscribe(mutations: ["addPost"]) updatedPost: Post @aws_subscribe(mutations: ["updatePost"]) deletedPost: Post @aws_subscribe(mutations: ["deletePost"]) }
Dado que la mutación @aws_subscribe(mutations: ["",..,""]) tiene una matriz de entradas de mutaciones, puede especificar varias mutaciones que inician una suscripción. Si se suscribe desde un cliente, su consulta de GraphQL podría tener el siguiente aspecto:
subscription NewPostSub { addedPost { __typename version title content author url } }
Esta consulta de suscripción es necesaria para las conexiones de cliente y para las herramientas.
En el caso del WebSockets cliente puro, el filtrado del conjunto de selección se realiza por cliente, ya que cada cliente puede definir su propio conjunto de selección. En este caso, el conjunto de selecciones de la suscripción debe ser un subconjunto del conjunto de selecciones de la mutación. Por ejemplo, una suscripción addedPost{author title} vinculada a la mutación addPost(...){id
author title url version} solo recibe el autor y el título de la publicación. No recibe el resto de campos. Sin embargo, si la mutación no tuviera al autor en su conjunto de selección, el suscriptor obtendría un null valor para el campo del autor (o un error si el campo del autor estuviera definido como required/not -null en el esquema).
El conjunto de selección de suscripciones es esencial cuando se usa pure WebSockets. Si un campo no está definido explícitamente en la suscripción, AWS AppSync no devuelve el campo.
En el ejemplo anterior, las suscripciones no tenía argumentos. Imaginemos que su esquema es similar al siguiente:
type Subscription { updatedPost(id:ID! author:String): Post @aws_subscribe(mutations: ["updatePost"]) }
En este caso, el cliente define una suscripción de este modo:
subscription UpdatedPostSub { updatedPost(id:"XYZ", author:"ABC") { title content } }
El tipo que devuelve el campo subscription del esquema debe coincidir con el tipo devuelto para el campo de mutación correspondiente. En el ejemplo anterior, tanto addPost como addedPost se devolvían con el tipo Post.
Para configurar las suscripciones en el cliente, consulte Creación de una aplicación cliente mediante el cliente de Amplify.
Uso de argumentos de suscripción
Un aspecto importante del uso de las suscripciones de GraphQL es comprender cuándo y cómo se deben usar los argumentos. Puede hacer cambios sutiles para modificar la forma y el momento de informar a los clientes acerca de las mutaciones que se han producido. Para ello, consulte el esquema de ejemplo del capítulo de inicio rápido, en el que se crean “Todos”. Para este esquema de ejemplo se definen las mutaciones siguientes:
type Mutation { createTodo(input: CreateTodoInput!): Todo updateTodo(input: UpdateTodoInput!): Todo deleteTodo(input: DeleteTodoInput!): Todo }
En el ejemplo de muestra, los clientes pueden suscribirse a las actualizaciones de cualquier Todo utilizando la opción onUpdateTodo subscription sin argumentos:
subscription OnUpdateTodo { onUpdateTodo { description id name when } }
Puede filtrar su subscription utilizando sus argumentos. Por ejemplo, para activar solo una subscription cuando se actualiza un todo con un ID específico, especifique el valor ID:
subscription OnUpdateTodo { onUpdateTodo(id: "a-todo-id") { description id name when } }
También se pueden transferir varios argumentos. Por ejemplo, la siguiente subscription muestra cómo recibir notificaciones de cualquier actualización de Todo en un lugar y hora específicos:
subscription todosAtHome { onUpdateTodo(when: "tomorrow", where: "at home") { description id name when where } }
Tenga en cuenta que todos los argumentos son opcionales. Si no especifica ningún argumento en su subscription, se suscribirá a todas las actualizaciones de Todo que se produzcan en su aplicación. Sin embargo, puede actualizar la definición de campo de su subscription para requerir el argumento ID. De este modo, forzaría la respuesta de un todo específico en lugar de la de todos los todo:
onUpdateTodo( id: ID!, name: String, when: String, where: String, description: String ): Todo
El valor nulo del argumento tiene un significado
Al realizar una consulta de suscripción AWS AppSync, un valor de null argumento filtrará los resultados de forma diferente a omitir el argumento por completo.
Volvamos al ejemplo de la API de todos, donde podríamos crear todos. Consulte el ejemplo de esquema del capítulo de inicio rápido.
Vamos a modificar nuestro esquema para incluir un nuevo campo owner, del tipo Todo, que describa quién es el propietario. El campo owner no es obligatorio y solo se puede configurar en UpdateTodoInput. Consulte la siguiente versión simplificada del esquema:
type Todo { id: ID! name: String! when: String! where: String! description: String! owner: String } input CreateTodoInput { name: String! when: String! where: String! description: String! } input UpdateTodoInput { id: ID! name: String when: String where: String description: String owner: String } type Subscription { onUpdateTodo( id: ID, name: String, when: String, where: String, description: String ): Todo @aws_subscribe(mutations: ["updateTodo"]) }
La siguiente suscripción devuelve todas las actualizaciones de Todo:
subscription MySubscription { onUpdateTodo { description id name when where } }
Si modifica la suscripción anterior para agregar el argumento del campo owner:
null, ahora está planteando una pregunta diferente. Ahora, esta suscripción registra al cliente para recibir notificaciones de todas las actualizaciones de Todo que no hayan indicado un propietario.
subscription MySubscription { onUpdateTodo(owner: null) { description id name when where } }
nota
A partir del 1 de enero de 2022, MQTT over WebSockets ya no estará disponible como protocolo para las suscripciones de GraphQL en las API. AWS AppSync Pure WebSockets es el único protocolo compatible AWS AppSync.
Los clientes basados en el AWS AppSync SDK o las bibliotecas de Amplify, lanzados después de noviembre de 2019, utilizan automáticamente pure de forma WebSockets predeterminada. La actualización de los clientes a la versión más reciente les permite utilizar el motor AWS AppSync puro WebSockets .
WebSockets Los Pure vienen con un tamaño de carga útil mayor (240 KB), una variedad más amplia de opciones de cliente y CloudWatch métricas mejoradas. Para obtener más información sobre el uso de WebSocket clientes puros, consulteCreación de un cliente en tiempo real en WebSocket AWS AppSync.