

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
<a name="aws-appsync-real-time-data"></a>

**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 ](https://docs.aws.amazon.com/appsync/latest/eventapi/publish-websocket.html) 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
<a name="graphql-schema-subscription-directives"></a>

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](security-authz.md).

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](building-a-client-app.md).

## Uso de argumentos de suscripción
<a name="using-subscription-arguments"></a>

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
<a name="argument-null-value-has-meaning"></a>

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, consulte[Creación de un cliente en tiempo real en WebSocket AWS AppSync](real-time-websocket-client.md).