Share via


Eventos de ciclo de vida de los clientes MQTT

Los eventos de ciclo de vida de cliente permiten a las aplicaciones reaccionar ante eventos sobre el estado de conexión del cliente o las operaciones de recursos de cliente. Eso le permite lo siguiente:

  • Supervise el estado de conexión de los clientes. Por ejemplo, puede compilar una aplicación que analice las conexiones de los clientes para optimizar el comportamiento.
  • React con una acción de mitigación para las desconexiones de cliente. Por ejemplo, puede compilar una aplicación que inicie un flujo de mitigación automática o cree una incidencia de soporte técnico cada vez que se desconecte un cliente.
  • Realice un seguimiento del espacio de nombres al que están asociados los clientes. Por ejemplo, confirme que los clientes están conectados al espacio de nombres correcto después de iniciar una conmutación por error.

Tipos de eventos

El espacio de nombres de Event Grid publica los siguientes tipos de eventos:

Tipo de evento Descripción
Microsoft.EventGrid.MQTTClientSessionConnected Se publica cuando la sesión de un cliente MQTT está conectada a Event Grid.
Microsoft.EventGrid.MQTTClientSessionDisconnected Se publica cuando la sesión de un cliente MQTT está desconectada de Event Grid.
Microsoft.EventGrid.MQTTClientCreatedOrUpdated Se publica cuando se crea o actualiza un cliente MQTT en el espacio de nombres de Azure Event Grid.
Microsoft.EventGrid.MQTTClientDeleted Publicado cuando se elimina un cliente MQTT del espacio de nombres de Azure Event Grid.

Esquema del evento

Los eventos de ciclo de vida del cliente proporcionan toda la información sobre el cliente y la sesión que se han conectado o desconectado. También proporciona una disconnectionReason que puede usar para escenarios de diagnóstico, ya que le permite automatizar acciones de mitigación.

Este evento de ejemplo muestra el esquema de un evento generado cuando la sesión de un cliente MQTT está conectada a una instancia de Event Grid:

[{
  "specversion": "1.0",
  "id": "5249c38a-a048-46dd-8f60-df34fcdab06c",
  "time": "2023-07-29T01:23:49.6454046Z",
  "type": "Microsoft.EventGrid.MQTTClientSessionConnected",
  "source": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myrg/providers/Microsoft.EventGrid/namespaces/myns",
  "subject": "clients/client1/sessions/session1",
  "data": {
    "namespaceName": "myns",
    "clientAuthenticationName": "client1",
    "clientSessionName": "session1",
    "sequenceNumber": 1
  }
}]

Este evento de ejemplo muestra el esquema de un evento generado cuando la sesión de un cliente MQTT está desconectada de Event Grid:

[{
  "specversion": "1.0",
  "id": "e30e5174-787d-4e19-8812-580148bfcf7b",
  "time": "2023-07-29T01:27:40.2446871Z",
  "type": "Microsoft.EventGrid.MQTTClientSessionDisconnected",
  "source": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myrg/providers/Microsoft.EventGrid/namespaces/myns",
  "subject": "clients/client1/sessions/session1",
  "data": {
    "namespaceName": "myns",
    "clientAuthenticationName": "client1",
    "clientSessionName": "session1",
    "sequenceNumber": 1,
    "disconnectionReason": "ClientInitiatedDisconnect"
  }
}]

Este ejemplo de evento muestra el esquema de un evento generado cuando un cliente MQTT es creado o actualizado en el espacio de nombres de Azure Event Grid:

[{
  "specversion": "1.0",
  "id": "383d1562-c95f-4095-936c-688e72c6b2bb",
  "time": "2023-07-29T01:14:35.8928724Z",
  "type": "Microsoft.EventGrid.MQTTClientCreatedOrUpdated",
  "source": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myrg/providers/Microsoft.EventGrid/namespaces/myns",
  "subject": "clients/client1",
  "data": {
    "createdOn": "2023-07-29T01:14:34.2048108Z",
    "updatedOn": "2023-07-29T01:14:34.2048108Z",
    "namespaceName": "myns",
    "clientName": "client1",
    "clientAuthenticationName": "client1",
    "state": "Enabled",
    "attributes": {
      "attribute1": "value1"
    }
  }
}]

Este ejemplo de evento muestra el esquema de un evento generado cuando un cliente MQTT es eliminado del espacio de nombres de Azure Event Grid:

[{
  "specversion": "1.0",
  "id": "2a93aaf9-66c2-4f8e-9ba3-8d899c10bf17",
  "time": "2023-07-29T01:30:52.5620566Z",
  "type": "Microsoft.EventGrid.MQTTClientDeleted",
  "source": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myrg/providers/Microsoft.EventGrid/namespaces/myns",
  "subject": "clients/client1",
  "data": {
    "namespaceName": "myns",
    "clientName": "client1",
    "clientAuthenticationName": "client1"
  }
}]

Motivos de desconexión:

En la lista siguiente se detallan los distintos valores de disconnectionReason y su descripción:

Motivo de desconexión Descripción
ClientAuthenticationError El cliente se desconectó por cualquier motivo de autenticación (por ejemplo, el certificado expiró, el cliente se deshabilitó o se cambió la configuración del cliente).
ClientAuthorizationError El cliente se desconectó por cualquier motivo de autorización (por ejemplo, debido a un cambio en la configuración de los espacios de temas, enlaces de permisos o grupos de clientes).
ClientError El cliente envió una solicitud incorrecta o usó una de las características no admitidas que dio lugar a una terminación de la conexión por parte del servicio.
ClientInitiatedDisconnect El cliente inicia una desconexión correcta mediante un paquete DISCONNECT para MQTT o un marco de cierre para MQTT a través de WebSocket.
ConnectionLost Se pierde la conexión de cliente-servidor.
IpForbidden El filtro IP o la configuración de vínculos privados bloquean la dirección IP del cliente.
QuotaExceeded El cliente superó uno o varios de los límites que dieron lugar a una terminación de conexión por parte del servicio.
ServerError La conexión se ha finalizado debido a un error inesperado del servidor.
ServerInitiatedDisconnect El servidor inicia una desconexión correcta por cualquier motivo operativo.
SessionOverflow La cola del cliente para los mensajes QoS1 sin confirmar alcanzó su límite, lo que dio lugar a una terminación de conexión por parte del servidor.
SessionTakenOver El cliente se volvió a conectar con el mismo nombre de autenticación, lo que dio lugar a la terminación de la conexión anterior.

Para obtener una descripción detallada de cada propiedad, consulte Esquema de eventos para espacios de nombres de Event Grid.

Sugerencia

Controlar una alta tasa de fluctuaciones en los estados de conexión: cuando se recibe un evento de desconexión de cliente, espere un período (por ejemplo, 30 segundos) y compruebe que el cliente sigue sin conexión antes de tomar una acción de mitigación. Esta optimización mejora la eficiencia en el control de los estados que cambian rápidamente.

Configuración

Configuración de Azure Portal

Siga estos pasos para emitir los eventos de ciclo de vida del cliente:

  1. En el espacio de nombres, vaya a la pestaña Eventos.
  2. Seleccione +Suscripción de eventos.
    • Proporcione un nombre para la suscripción de Event Grid.
    • Seleccione el esquema de eventos que prefiera para el consumo de eventos.
    • Filtre los eventos en Tipos de eventos.
    • Rellene los detalles del punto de conexión.
  3. Seleccione Crear.

Configuración de la CLI de Azure

Siga estos pasos para emitir los eventos de ciclo de vida del cliente:

  1. Creación de un tema del sistema
az eventgrid system-topic create --resource-group <Resource Group > --name <System Topic Name> --location \<Region> --topic-type Microsoft.EventGrid.Namespaces --source /subscriptions//resourceGroups/<Resource Group >/providers/Microsoft.EventGrid/namespaces/<Namespace Name>
  1. Creación de una suscripción a Event Grid
  az eventgrid system-topic event-subscription create --name <Specify Event Subscription Name> -g <Resource Group> --system-topic-name <System Topic Name> --endpoint <Endpoint>

Comportamiento:

  • No hay ninguna garantía de latencia para los eventos de ciclo de vida de cliente. Los eventos de estado de conexión de cliente indican el último estado notificado de la conexión de la sesión del cliente, no el estado de conexión en tiempo real.
  • Es posible que se publiquen eventos de ciclo de vida de cliente duplicados.
  • La marca de tiempo de los eventos de ciclo de vida del cliente indica cuándo el servicio detectó los eventos, que puede diferir del tiempo real del evento.
  • No se garantiza el orden de los eventos de ciclo de vida del cliente, los eventos pueden llegar desordenados. Sin embargo, el número de secuencia del evento de estado de la conexión se puede usar para determinar el orden original de los eventos.
  • Para el evento Client Created o Updated y el evento Client Deleted:
    • Si hay varios cambios de estado en el recurso de cliente en un breve período de tiempo, se emitirá un evento para el estado final del cliente.
    • Ejemplo 1: si se crea un cliente, y, a continuación, se actualiza dos veces en 3 segundos, EG emitirá solo un evento MQTTClientCreatedOrUpdated con los valores finales para los metadatos del cliente.
    • Ejemplo 2: si se crea un cliente, y, a continuación, se elimina en un plazo de 5 segundos, EG emitirá solo el evento MQTTClientDeleted.

Ordenar eventos de estado de conexión:

El número de secuencia de los eventos MQTTClientSessionConnected y MQTTClientSessionDisconnected se puede usar para determinar el último estado notificado de la conexión de la sesión de cliente a medida que el número de secuencia se incrementa con cada evento nuevo. El número de secuencia para MQTTClientSessionDisconnected siempre coincide con el número de secuencia del evento MQTTClientSessionConnected para la misma conexión. Por ejemplo, la lista de eventos y números de secuencia siguientes es un ejemplo de eventos en el orden correcto para el mismo cliente:

  • MQTTClientSessionConnected > "sequenceNumber": 1
  • MQTTClientSessionDisconnected > "sequenceNumber": 1
  • MQTTClientSessionConnected > "sequenceNumber": 2
  • MQTTClientSessionDisconnected > "sequenceNumber": 2

Esta es una lógica de ejemplo para ordenar los eventos: para cada cliente:

  • Almacene el número de secuencia y el estado de conexión del primer evento.
  • Para cada nuevo evento de MQTTClientSessionConnected:
    • si el nuevo número de secuencia es mayor que el anterior, actualice el número de secuencia y el estado de conexión para que coincida con el nuevo evento.
  • Para cada nuevo evento de MQTTClientSessionDisconnected:
    • si el nuevo número de secuencia es igual o mayor que el anterior, actualice el número de secuencia y el estado de conexión para que coincida con el nuevo evento.

Pasos siguientes