Eventos do ciclo de vida de 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 sobre as operações de recursos do cliente. Ele permite:

  • Monitorar o status de conexão dos 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 cliente. 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.
  • Acompanhar o namespace ao qual os clientes estão anexados. Por exemplo, confirme se os clientes estão conectados ao namespace certo depois de você iniciar um failover.

Tipos de evento

O namespace da Grade de Eventos publica os seguintes tipos de eventos:

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 da Grade de Eventos.
Microsoft.EventGrid.MQTTClientDeleted Publicado quando um cliente MQTT é excluído do Namespace da Grade de Eventos.

Esquema do evento

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. Também fornecem um disconnectionReason que você pode usar para cenários de diagnóstico, pois permite que você tenha ações de mitigação automatizadas.

Este exemplo de evento 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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myrg/providers/Microsoft.EventGrid/namespaces/myns",
  "subject": "clients/client1/sessions/session1",
  "data": {
    "namespaceName": "myns",
    "clientAuthenticationName": "client1",
    "clientSessionName": "session1",
    "sequenceNumber": 1
  }
}]

Este exemplo de evento mostra o esquema de um evento gerado quando a sessão de um cliente MQTT é desconectada da 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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myrg/providers/Microsoft.EventGrid/namespaces/myns",
  "subject": "clients/client1",
  "data": {
    "namespaceName": "myns",
    "clientName": "client1",
    "clientAuthenticationName": "client1"
  }
}]

Motivos de desconexão:

A seguinte lista fornece detalhes sobre os diferentes valores do disconnectionReason e a descrição:

Motivo da desconexão Descrição
ClientAuthenticationError o cliente foi desconectado por qualquer motivo de autenticação (por exemplo, o certificado expirou, o cliente foi desabilitado ou a configuração do cliente foi alterada)
ClientAuthorizationError o cliente foi desconectado por algum motivo de autorização (por exemplo, devido a uma alteração na configuração de espaços de tópicos, associações de permissão ou grupos de clientes)
ClientError o cliente enviou uma solicitação inválida ou usou um dos recursos sem suporte que resultou em um encerramento da conexão pelo serviço.
ClientInitiatedDisconnect o cliente inicia uma desconexão normal por meio de um pacote DISCONNECT do MQTT ou fecha um quadro do MQTT via WebSocket.
ConnectionLost a conexão cliente-servidor é perdida.
IpForbidden 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 resultou em um encerramento da conexão pelo serviço.
ServerError a conexão foi encerrada devido a um erro inesperado do servidor
ServerInitiatedDisconnect o servidor inicia uma desconexão normal por qualquer motivo operacional
SessionOverflow a fila do cliente de mensagens QoS1 não confirmadas atingiu o limite, o que resultou em um encerramento da conexão pelo servidor
SessionTakenOver o cliente reconectou-se com o mesmo nome de autenticação, o que resultou no encerramento da conexão anterior.

Para ver uma descrição detalhada de cada propriedade, confira Esquema de evento do namespace da Grade de Eventos.

Dica

Processamento de uma alta taxa de flutuações nos estados de conexão: quando um evento de desconexão do cliente é recebido, aguarde um tempo (por exemplo, 30 segundos) e verifique se o cliente ainda está offline antes de executar uma ação de mitigação. Essa otimização aprimora a eficiência no processamento 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, acesse a guia Eventos.
  2. Selecione +Assinatura de Evento.
    • Forneça um nome para a assinatura da Grade de Eventos.
    • Selecione o Esquema de Eventos que prefere usar para o consumo de eventos.
    • Filtre os eventos em Tipos de Eventos.
    • Preencha os detalhes do ponto de extremidade.
  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 assinatura da Grade 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á nenhuma garantia de latência para os eventos de ciclo de vida do cliente. Os eventos do status de conexão do cliente indicam o último estado relatado da conexão da sessão do cliente, não o status de conexão em tempo real.
  • Os eventos de ciclo de vida do cliente duplicados podem ser publicados.
  • O carimbo de data/hora dos eventos do ciclo de vida do cliente indica quando o serviço detectou os eventos, que pode ser diferente do tempo 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 em um curto período de tempo, haverá um evento emitido para o estado final do cliente.
    • Exemplo 1: se um cliente for criado e atualizado duas vezes em três segundos, o EG emitirá apenas um evento MQTTClientCreatedOrUpdated com os valores finais para os metadados do cliente.
    • Exemplo 2: se um cliente for criado e excluído dentro de 5 segundos, o EG emitirá apenas o evento MQTTClientDeleted.

Ordene os eventos do status de 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 do MQTTClientSessionDisconnected sempre corresponde ao número de sequência do evento MQTTClientSessionConnected na 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
  • MQTTClientSessionDisconnected > "sequenceNumber": 1
  • MQTTClientSessionConnected > "sequenceNumber": 2
  • MQTTClientSessionDisconnected > "sequenceNumber": 2

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

  • Armazene o número de sequência e status de 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 de conexão para que eles correspondam 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óximas etapas