Share via


MQTT 클라이언트 수명 주기 이벤트

클라이언트 수명 주기 이벤트를 사용하면 애플리케이션이 클라이언트 연결 상태 또는 클라이언트 리소스 작업에 대한 이벤트에 반응할 수 있습니다. 다음을 수행할 수 있습니다.

  • 클라이언트의 연결 상태를 모니터링합니다. 예를 들어 클라이언트의 연결을 분석하여 동작을 최적화하는 애플리케이션을 빌드할 수 있습니다.
  • 클라이언트 연결 끊김에 대한 완화 작업을 사용하여 대응합니다. 예를 들어 자동 완화 흐름을 시작하거나 클라이언트 연결이 끊어질 때마다 지원 티켓을 만드는 애플리케이션을 빌드할 수 있습니다.
  • 클라이언트가 연결된 네임스페이스를 추적합니다. 예를 들어 장애 조치(failover)를 시작한 후 클라이언트가 올바른 네임스페이스에 연결되어 있는지 확인합니다.

일정 유형

Event Grid 네임스페이스는 다음 이벤트 유형을 게시합니다.

이벤트 유형 설명
Microsoft.EventGrid.MQTTClientSessionConnected MQTT 클라이언트 세션이 Event Grid에 연결되면 게시됩니다.
Microsoft.EventGrid.MQTTClientSessionDisconnected MQTT 클라이언트 세션이 Event Grid에서 연결이 끊어지면 게시됩니다.
Microsoft.EventGrid.MQTTClientCreatedOrUpdated Event Grid 네임스페이스에서 MQTT 클라이언트가 만들어지거나 업데이트될 때 게시됩니다.
Microsoft.EventGrid.MQTTClientDeleted Event Grid 네임스페이스에서 MQTT 클라이언트가 삭제되면 게시됩니다.

이벤트 스키마

클라이언트 수명 주기 이벤트는 연결되거나 연결이 끊긴 클라이언트 및 세션에 대한 모든 정보를 제공합니다. 또한 자동화된 완화 작업을 수행할 수 있으므로 진단 시나리오에 사용할 수 있는 disconnectionReason을 제공합니다.

이 샘플 이벤트는 MQTT 클라이언트의 세션이 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
  }
}]

이 샘플 이벤트는 MQTT 클라이언트 세션이 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"
  }
}]

이 샘플 이벤트는 Event Grid 네임스페이스에서 MQTT 클라이언트가 만들어지거나 업데이트될 때 발생하는 이벤트의 스키마를 보여 줍니다.

[{
  "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"
    }
  }
}]

이 샘플 이벤트는 MQTT 클라이언트가 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"
  }
}]

연결 끊김 이유:

다음 목록에서는 disconnectionReason의 다양한 값과 해당 설명을 자세히 설명합니다.

연결 끊김 이유 설명
ClientAuthenticationError 인증 이유로 인해 클라이언트 연결이 끊어졌습니다(예: 인증서 만료, 클라이언트 사용하지 않도록 설정 또는 클라이언트 구성 변경).
ClientAuthorizationError 권한 부여 이유(예: 항목 공간, 권한 바인딩 또는 클라이언트 그룹의 구성 변경으로 인해)로 인해 클라이언트 연결이 끊어졌습니다.
ClientError 클라이언트가 잘못된 요청을 보냈거나 지원되지 않는 기능 중 하나를 사용하여 서비스에 의해 연결이 종료되었습니다.
ClientInitiatedDisconnect 클라이언트는 MQTT에 대한 DISCONNECT 패킷 또는 WebSocket을 통한 MQTT에 대한 닫기 프레임을 통해 정상적인 연결 끊기를 시작합니다.
ConnectionLost 클라이언트-서버 연결이 끊어졌습니다.
IpForbidden 클라이언트의 IP 주소는 IP 필터 또는 프라이빗 링크 구성에 의해 차단됩니다.
QuotaExceeded 클라이언트가 하나 이상의 제한 한도를 초과하여 서비스에 의한 연결이 종료되었습니다.
ServerError 예기치 못한 서버 오류로 인해 연결이 종료되었습니다.
ServerInitiatedDisconnect 서버는 운영상의 이유로 정상적인 연결 끊기를 시작합니다.
SessionOverflow 확인되지 않은 QoS1 메시지에 대한 클라이언트 큐가 한도에 도달하여 서버에 의해 연결이 종료되었습니다.
SessionTakenOver 클라이언트가 동일한 인증 이름으로 다시 연결되었으며, 이로 인해 이전 연결이 종료되었습니다.

각 속성에 대한 자세한 설명은 Event Grid 네임스페이스에 대한 이벤트 스키마를 참조하세요.

연결 상태의 높은 변동률 처리: 클라이언트 연결 끊기 이벤트가 수신되면 잠시(예: 30초) 기다린 후 완화 작업을 수행하기 전에 클라이언트가 여전히 오프라인 상태인지 확인합니다. 이 최적화는 빠르게 변화하는 상태를 처리하는 효율성을 향상시킵니다.

구성

Azure Portal 구성

다음 단계를 사용하여 클라이언트 수명 주기 이벤트를 내보냅니다.

  1. 네임스페이스에서 이벤트 탭으로 이동합니다.
  2. +이벤트 구독을 선택합니다.
    • Event Grid 구독의 이름을 제공합니다.
    • 이벤트 사용에 선호하는 이벤트 스키마를 선택합니다.
    • 이벤트 유형으로 이벤트를 필터링합니다.
    • 엔드포인트 세부 정보를 채웁니다.
  3. 만들기를 실행합니다.

Azure CLI 구성

다음 단계를 사용하여 클라이언트 수명 주기 이벤트를 내보냅니다.

  1. 시스템 토픽 만들기
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. 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>

동작:

  • 클라이언트 수명 주기 이벤트에는 보장된 대기 시간이 없습니다. 클라이언트 연결 상태 이벤트는 실시간 연결 상태가 아니라 마지막으로 보고된 클라이언트 세션 연결 상태를 나타냅니다.
  • 중복된 클라이언트 수명 주기 이벤트를 게시할 수 있습니다.
  • 클라이언트 수명 주기 이벤트의 타임스탬프는 서비스에서 이벤트를 감지한 시기를 나타내며, 이는 이벤트의 실제 시간과 다를 수 있습니다.
  • 클라이언트 수명 주기 이벤트의 순서는 보장되지 않으며 이벤트가 순서대로 도착할 수 있습니다. 그러나 연결 상태 이벤트의 시퀀스 번호를 사용하여 이벤트의 원래 순서를 확인할 수 있습니다.
  • 클라이언트 만들기 또는 업데이트 이벤트 및 클라이언트 삭제 이벤트의 경우:
    • 짧은 시간 내에 클라이언트 리소스에 여러 상태 변경 내용이 있는 경우 클라이언트의 최종 상태에 대해 하나의 이벤트를 내보냅니다.
    • 예제 1: 클라이언트를 만든 다음, 3초 이내에 두 번 업데이트하면 EG는 클라이언트의 메타데이터에 대한 최종 값과 함께 하나의 MQTTClientCreatedOrUpdated 이벤트만 내보냅니다.
    • 예제 2: 클라이언트를 만든 다음, 5초 이내에 삭제하면 EG는 MQTTClientDeleted 이벤트만 내보냅니다.

순서 연결 상태 이벤트:

MQTTClientSessionConnected 및 MQTTClientSessionDisconnected 이벤트의 시퀀스 번호를 사용하여 시퀀스 번호가 모든 새 이벤트로 증분됨에 따라 마지막으로 보고된 클라이언트 세션 연결 상태를 확인할 수 있습니다. MQTTClientSessionDisconnected의 시퀀스 번호는 동일한 연결의 경우 항상 MQTTClientSessionConnected 이벤트의 시퀀스 번호와 일치합니다. 예를 들어 아래의 이벤트 및 시퀀스 번호 목록은 동일한 클라이언트의 경우 올바른 이벤트 샘플 순서입니다.

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

이벤트 순서를 지정하는 샘플 논리는 다음과 같습니다. 각 클라이언트별로 다음을 수행합니다.

  • 첫 번째 이벤트의 시퀀스 번호와 연결 상태를 저장합니다.
  • 모든 새 MQTTClientSessionConnected 이벤트별로 다음을 수행합니다.
    • 새 시퀀스 번호가 이전 시퀀스 번호보다 크면 새 이벤트와 일치하도록 시퀀스 번호와 연결 상태를 업데이트합니다.
  • 모든 새 MQTTClientSessionDisconnected 이벤트별로 다음을 수행합니다.
    • 새 시퀀스 번호가 이전 시퀀스 번호보다 같거나 크면 새 이벤트와 일치하도록 시퀀스 번호와 연결 상태를 업데이트합니다.

다음 단계