Share via


Eventos do ciclo de vida dos clientes MQTT

Os eventos do Ciclo de Vida do Cliente permitem que os aplicativos reajam a eventos sobre o status da conexão do cliente ou as operações de recursos do cliente. Permite-lhe:

  • Monitore o status da conexão de seus clientes. Por exemplo, você pode criar um aplicativo que analisa as conexões dos clientes para otimizar o comportamento.
  • Reaja com uma ação de mitigação para desconexões de clientes. Por exemplo, você pode criar um aplicativo que inicia um fluxo de mitigação automática ou cria um tíquete de suporte sempre que um cliente é desconectado.
  • Rastreie o namespace ao qual seus clientes estão conectados. Por exemplo, confirme se seus clientes estão conectados ao namespace certo depois de iniciar um failover.

Tipos de evento

O namespace Event Grid publica os seguintes tipos de evento:

Tipo de evento Descrição
Microsoft.EventGrid.MQTTClientSessionConnected Publicado quando a sessão de um cliente MQTT é conectada à Grade de Eventos.
Microsoft.EventGrid.MQTTClientSessionDisconnected Publicado quando a sessão de um cliente MQTT é desconectada da Grade de Eventos.
Microsoft.EventGrid.MQTTClientCreatedOrUpdated Publicado quando um cliente MQTT é criado ou atualizado no namespace Event Grid.
Microsoft.EventGrid.MQTTClientDeleted Publicado quando um cliente MQTT é excluído do namespace Event Grid.

Esquema de eventos

Os eventos do ciclo de vida do cliente fornecem todas as informações sobre o cliente e a sessão que foi conectada ou desconectada. Ele também fornece um disconnectionReason que você pode usar para cenários de diagnóstico, pois permite que você tenha ações de mitigação automatizadas.

Este evento de exemplo mostra o esquema de um evento gerado quando a sessão de um cliente MQTT é conectada a uma grade de eventos:

[{
  "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 exemplo mostra o esquema de um evento gerado quando a sessão de um cliente MQTT é desconectada à Grade de Eventos:

[{
  "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 evento de exemplo mostra o esquema de um evento gerado quando um cliente MQTT é criado ou atualizado no namespace da grade de eventos:

[{
  "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 evento de exemplo mostra o esquema de um evento gerado quando um cliente MQTT é excluído do namespace da grade de eventos:

[{
  "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 desconexão:

A lista a seguir detalha os diferentes valores para disconnectionReason e sua descrição:

Motivo da desconexão Description
ClientAuthenticationError o cliente foi desconectado por quaisquer motivos de autenticação (por exemplo, certificado expirado, cliente desativado ou configuração do cliente alterada)
ClientAuthorizationError o cliente foi desconectado por quaisquer motivos de autorização (por exemplo, devido a uma alteração na configuração de espaços de tópico, associações de permissão ou grupos de clientes)
ClientError O cliente enviou uma solicitação incorreta ou usou um dos recursos não suportados que resultaram em um término de conexão pelo serviço.
ClientInitiatedDisconnect o cliente inicia uma desconexão normal através de um pacote DISCONNECT para MQTT ou um quadro fechado para MQTT sobre WebSocket.
ConexãoLost A conexão cliente-servidor é perdida.
IpProibido o endereço IP do cliente é bloqueado pelo filtro IP ou pela configuração de links privados.
QuotaExceeded O cliente excedeu um ou mais dos limites de limitação que resultaram no término da conexão pelo serviço.
Erro de servidor A conexão foi encerrada devido a um erro inesperado do servidor
ServerInitiatedDisconnect O servidor inicia uma desconexão normal por qualquer motivo operacional
Estouro de sessão a fila do cliente para mensagens QoS1 não reconhecidas atingiu seu limite, o que resultou em um encerramento de conexão pelo servidor
SessionTakenOver O cliente se reconectou com o mesmo nome de autenticação, o que resultou no término da conexão anterior.

Para obter uma descrição detalhada de cada propriedade, consulte Esquema de eventos para Namespace de grade de eventos.

Gorjeta

Lidando com alta taxa de flutuações nos estados de conexão: Quando um evento de desconexão do cliente é recebido, aguarde um período (por exemplo, 30 segundos) e verifique se o cliente ainda está offline antes de tomar uma ação atenuante. Essa otimização melhora a eficiência no tratamento de estados em rápida mudança.

Configuração

Configuração do portal do Azure

Use as seguintes etapas para emitir os eventos do ciclo de vida do cliente:

  1. No namespace, vá para a guia Eventos.
  2. Selecione +Subscrição de Eventos.
    • Forneça um nome para sua assinatura da Grade de Eventos.
    • Selecione o esquema de eventos que você prefere para consumo de eventos.
    • Filtre os eventos em Tipos de Evento.
    • Preencha os detalhes do seu ponto final.
  3. Selecione Criar.

Configuração da CLI do Azure

Use as seguintes etapas para emitir os eventos do ciclo de vida do cliente:

  1. Criar um tópico do 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. Criar uma Subscrição de Grelha de Eventos
  az eventgrid system-topic event-subscription create --name <Specify Event Subscription Name> -g <Resource Group> --system-topic-name <System Topic Name> --endpoint <Endpoint>

Comportamento:

  • Não há garantia de latência para os eventos do ciclo de vida do cliente. Os eventos de status de conexão do cliente indicam o último estado relatado da conexão da sessão do cliente, não o status da conexão em tempo real.
  • Eventos duplicados do ciclo de vida do cliente podem ser publicados.
  • O carimbo de data/hora dos eventos do ciclo de vida do cliente indica quando o serviço detetou os eventos, que podem diferir da hora real do evento.
  • A ordem dos eventos do ciclo de vida do cliente não é garantida, os eventos podem chegar fora de ordem. No entanto, o número de sequência nos eventos de status da conexão pode ser usado para determinar a ordem original dos eventos.
  • Para o evento Cliente Criado ou Atualizado e o evento Cliente Excluído:
    • Se houver várias alterações de estado no recurso do cliente dentro de um curto período de tempo, haverá um evento emitido para o estado final do cliente.
    • Exemplo 1: se um cliente for criado, atualizado duas vezes em 3 segundos, o EG emitirá apenas um evento MQTTClientCreatedOrUpdated com os valores finais para os metadados do cliente.
    • Exemplo 2: se um cliente for criado, então excluído dentro de 5 segundos, o EG emitirá apenas o evento MQTTClientDelete.

Ordenar eventos de status da conexão:

O número de sequência nos eventos MQTTClientSessionConnected e MQTTClientSessionDisconnected pode ser usado para determinar o último estado relatado da conexão da sessão do cliente à medida que o número de sequência é incrementado a cada novo evento. O número de sequência para o MQTTClientSessionDisconnected sempre corresponde ao número de sequência do evento MQTTClientSessionConnected para a mesma conexão. Por exemplo, a lista de eventos e números de sequência abaixo é uma amostra de eventos na ordem certa para o mesmo cliente:

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

Aqui está um exemplo de lógica para ordenar os eventos: Para cada cliente:

  • Armazene o número de sequência e o status da conexão do primeiro evento.
  • Para cada novo evento MQTTClientSessionConnected:
    • Se o novo número de sequência for maior que o anterior, atualize o número de sequência e o status da conexão para corresponder ao novo evento.
  • Para cada novo evento MQTTClientSessionDisconnected:
    • Se o novo número de sequência for igual ou maior que o anterior, atualize o número de sequência e o status da conexão para corresponder ao novo evento.

Próximos passos