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/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
}
}]
이 샘플 이벤트는 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/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"
}
}]
이 샘플 이벤트는 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/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"
}
}
}]
이 샘플 이벤트는 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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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 구성
다음 단계를 사용하여 클라이언트 수명 주기 이벤트를 내보냅니다.
- 네임스페이스에서 이벤트 탭으로 이동합니다.
- +이벤트 구독을 선택합니다.
- Event Grid 구독의 이름을 제공합니다.
- 이벤트 사용에 선호하는 이벤트 스키마를 선택합니다.
- 이벤트 유형으로 이벤트를 필터링합니다.
- 엔드포인트 세부 정보를 채웁니다.
- 만들기를 실행합니다.
Azure CLI 구성
다음 단계를 사용하여 클라이언트 수명 주기 이벤트를 내보냅니다.
- 시스템 토픽 만들기
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>
- 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 이벤트별로 다음을 수행합니다.
- 새 시퀀스 번호가 이전 시퀀스 번호보다 같거나 크면 새 이벤트와 일치하도록 시퀀스 번호와 연결 상태를 업데이트합니다.
다음 단계
- 시스템 토픽에 대해 자세히 알아보려면 Azure Event Grid의 시스템 토픽으로 이동하세요.
- 클라이언트 수명 주기 이벤트 속성에 대해 자세히 알아보려면 Event Grid 원본인 Event Grid로 이동하세요.