Azure Event Grid의 MQTT 브로커 기능에서 지원하는 MQTT 기능
MQTT는 제한된 환경을 위해 설계된 게시-구독 메시징 전송 프로토콜입니다. 효율적이고 확장 가능하며 신뢰할 수 있으므로 IoT 시나리오에서 통신의 표준이 됩니다. MQTT 브로커는 MQTT v3.1.1을 통한 메시지, WebSocket을 통한 MQTT v3.1.1, MQTT v5 및 WebSocket을 통한 MQTT v5를 게시하고 구독하는 클라이언트를 지원합니다. MQTT 브로커는 MQTT 버전 간(MQTT 3.1.1 및 MQTT 5) 통신도 지원합니다.
MQTT v5는 보다 원활하고 투명하며 효율적인 통신을 제공하기 위해 MQTT v3.1.1보다 많은 개선 사항을 도입했습니다. 추가된 내용은 다음과 같습니다.
- 오류 보고 기능 개선
- 사용자 속성 및 콘텐츠 형식과 같은 기능을 통해 보다 투명한 통신 클라이언트
- 메시지 및 세션 만료와 같은 기능을 통해 통신을 통한 클라이언트 제어를 강화합니다.
- 요청-응답 패턴과 같은 표준 중요 패턴입니다.
연결 흐름:
MQTT 클라이언트는 TLS 1.2 또는 TLS 1.3을 통해 연결해야 합니다. 이 단계를 건너뛰려고 하면 연결에 실패합니다.
MQTT 브로커에 연결하는 동안 MQTT를 통해 통신하는 동안 다음 포트를 사용합니다.
- TCP 포트 8883의 MQTT v3.1.1 및 MQTT v5
- TCP 포트 443의 WebSocket을 통해 WebSocket 및 MQTTv5를 통해 MQTT v3.1.1
CONNECT 패킷에는 다음 속성이 포함되어야 합니다.
- ClientId 필드가 필요하며 클라이언트의 세션 이름을 포함해야 합니다. 세션 이름은 네임스페이스에서 고유해야 합니다. 각 클라이언트가 클라이언트당 하나의 세션을 사용하는 경우 클라이언트 인증 이름을 세션 이름으로 사용할 수 있습니다. 한 클라이언트가 여러 세션을 사용하는 경우 각 세션별 ClientId에 대해 서로 다른 값을 사용해야 합니다.
- 네임스페이스를 만드는 동안 alternativeAuthenticationNameSources에서 값을 선택하지 않은 경우 사용자 이름 필드가 필요합니다. 이 경우 사용자 이름 필드에 클라이언트의 인증 이름을 제공해야 합니다. 해당 이름은 제공된 인증 이름 및 클라이언트 리소스를 만드는 동안 지정된 클라이언트의 인증서 필드 값과 일치해야 합니다.
클라이언트 인증에 대해 자세히 알아봅니다.
다중 세션 지원
다중 세션 지원을 사용하면 여러 활성 세션이 동시에 있는 MQTT 브로커에 연결하여 애플리케이션 MQTT 클라이언트의 확장성과 안정성을 높일 수 있습니다.
네임스페이스 구성
이 기능을 사용하기 전에 클라이언트당 여러 세션을 허용하도록 네임스페이스를 구성해야 합니다. 다음 단계를 사용하여 Azure Portal에서 클라이언트당 여러 세션을 구성합니다.
- Azure Portal에서 네임스페이스로 이동합니다.
- 구성에서 인증 이름당 최대 클라이언트 세션의 값을 클라이언트당 원하는 세션 수로 변경합니다.
- 적용을 선택합니다.
참고 항목
Azure CLI 구성의 경우 네임스페이스 페이로드의 MaxClientSessionsPerAuthenticationName 속성을 원하는 값으로 업데이트합니다.
연결 흐름:
각 세션에 대한 CONNECT 패킷에는 다음 속성이 포함되어야 합니다.
- CONNECT 패킷에 Username 속성을 제공하여 클라이언트 인증 이름을 나타냅니다.
- CONNECT 패킷에 ClientID 속성을 제공하여 각 사용자 이름에 대한 ClientID 값이 하나 이상 있는 경우와 같이 세션 이름을 나타냅니다.
예를 들어 CONNECT 패킷에서 Username 및 ClientId의 다음 조합을 사용하면 클라이언트 "Mgmt-application"이 세 개의 독립 세션을 통해 MQTT 브로커에 연결할 수 있습니다.
- 첫 번째 세션:
- 사용자 이름:
Mgmt-application
- ClientId:
Mgmt-Session1
- 사용자 이름:
- 두 번째 세션:
- 사용자 이름:
Mgmt-application
- ClientId:
Mgmt-Session2
- 사용자 이름:
- 세 번째 세션:
- 사용자 이름:
Mgmt-application
- ClientId:
Mgmt-Session3
- 사용자 이름:
자세한 내용은 단일 클라이언트에 여러 세션을 설정하는 방법을 참조하세요.
세션 처리:
- 클라이언트가 다른 인증 이름으로 세션 이름을 표시하여 다른 클라이언트의 활성 세션을 인수하려고 하면 권한 없는 오류로 인해 해당 연결 요청이 거부됩니다. 예를 들어 클라이언트 B가 해당 시간에 클라이언트 A에 할당된 세션 123에 연결하려고 하면 클라이언트 B의 연결 요청이 거부됩니다. 즉, 동일한 클라이언트가 동일한 세션 이름과 동일한 인증 이름으로 다시 연결하려고 하면 기존 세션을 인수할 수 있습니다.
- 클라이언트 리소스가 세션을 종료하지 않고 삭제되는 경우 세션이 만료될 때까지 다른 클라이언트는 해당 세션 이름을 사용할 수 없습니다. 예를 들어 클라이언트 B가 세션 이름이 123인 세션을 만든 경우 클라이언트 B가 삭제되면 클라이언트 A는 만료될 때까지 세션 123에 연결할 수 없습니다.
- 클라이언트당 세션 수 제한은 언제든지 온라인 및 오프라인 세션에 적용됩니다. 예를 들어 인증 이름당 최대 클라이언트 세션이 1로 설정된 네임스페이스를 고려합니다. 클라이언트 A가 영구 세션 123과 연결한 후 연결이 끊어지면 클라이언트 A는 오프라인 상태인 경우에도 세션 123이 여전히 활성 상태이므로 새 세션 456에 연결할 수 없습니다. 따라서 다시 연결할 때마다 새 세션 이름을 생성하는 것이 아니라 동일한 클라이언트는 항상 동일한 정적 세션 이름으로 다시 연결하는 것이 좋습니다.
MQTT 기능
Azure Event Grid의 MQTT 브로커 기능은 다음 MQTT 기능을 지원합니다.
QoS(서비스 품질)
MQTT 브로커는 클라이언트와 MQTT 브로커 간의 PUBLISH 및 SUBSCRIBE 패킷에 대한 메시지 배달 보장을 정의하는 QoS 0 및 1을 지원합니다. QoS 0은 최대 한 번의 배달을 보장합니다. QoS 0이 있는 메시지는 구독자가 승인하거나 게시자가 다시 전송하지 않습니다. QoS 1은 최소 한 번의 배달을 보장합니다. 메시지는 구독자가 승인하고 승인되지 않은 경우 게시자가 다시 전송합니다. QoS를 사용하면 클라이언트가 통신 효율성과 안정성을 제어할 수 있습니다.
영구 세션
MQTT 브로커는 MQTT v3.1.1에 대한 영구 세션을 지원하기 때문에 MQTT 브로커는 통신 안정성을 보장하기 위해 연결이 끊어질 경우 클라이언트 세션 정보를 유지합니다. 이 정보에는 클라이언트의 구독 및 누락/승인되지 않은 QoS 1 메시지가 포함됩니다. 클라이언트는 CONNECT 패킷의 cleanSession 플래그를 false로 설정하여 영구 세션을 구성할 수 있습니다.
시작 및 세션 만료 정리
MQTT v5는 세션 지속성 처리 시 MQTT v3.1.1에 비해 향상된 시작 및 세션 만료 정리 기능을 도입했습니다. 시작 정리는 클라이언트가 MQTT 브로커를 사용하여 새 세션을 시작하고 이전 세션 데이터를 삭제할 수 있는 기능입니다. 세션 만료를 사용하면 클라이언트가 비활성 세션이 만료되어 자동으로 제거된 것으로 간주될 때 MQTT 브로커에 알릴 수 있습니다. CONNECT 패킷에서 클라이언트는 보안상의 이유로 또는 이전 세션 중에 발생할 수 있는 잠재적인 데이터 충돌을 방지하기 위해 클린 시작 플래그를 true 및/또는 짧은 세션 만료 간격으로 설정할 수 있습니다. 클라이언트는 영구 세션의 안정성과 효율성을 보장하기 위해 새 시작을 false 및/또는 긴 세션 만료 간격으로 설정할 수도 있습니다.
최대 세션 만료 간격 구성
Event Grid 네임스페이스에 연결하는 모든 클라이언트에 허용되는 최대 세션 만료 간격을 구성할 수 있습니다. MQTT v3.1.1 클라이언트의 경우 구성된 제한은 모든 영구 세션에 대한 기본 세션 만료 간격으로 적용됩니다. MQTT v5 클라이언트의 경우 구성된 제한이 CONNECT 패킷의 세션 만료 간격 속성에 대한 최댓값으로 적용됩니다. 한도를 초과하는 모든 값은 조정됩니다. 이 네임스페이스 속성의 기본값은 1시간이며 최대 8시간까지 연장할 수 있습니다. 다음 단계를 사용하여 Azure Portal에서 최대 세션 만료 간격을 구성합니다.
- Azure Portal에서 네임스페이스로 이동합니다.
- 구성에서 최대 세션 만료 간격(시간)의 값을 원하는 제한으로 변경합니다.
- 적용을 선택합니다.
세션 오버플로
MQTT 브로커는 클라이언트가 MQTT 브로커와 다시 연결하여 큐의 메시지를 받을 때까지 연결되지 않은 각 활성 MQTT 세션의 메시지 큐를 유지 관리합니다. 클라이언트가 큐에 대기 중인 QOS1 메시지를 수신하기 위해 연결하지 않으면 세션 큐는 100개의 메시지 또는 1MB 제한에 도달할 때까지 메시지 누적을 시작합니다. 세션 수명 동안 큐가 제한에 도달하면 세션이 종료됩니다.
LWT(최후의 유언장) 메시지
LWT(Last Will and Testament)는 MQTT 클라이언트에 다른 MQTT 클라이언트의 갑작스러운 연결 끊김을 알립니다. LWT를 사용하면 예기치 않은 연결 끊김 시 MQTT 클라이언트 간의 예측 가능하고 신뢰할 수 있는 통신 흐름을 보장할 수 있습니다. 이는 실시간 통신, 시스템 안정성 및 조정된 작업이 중요한 시나리오에 유용합니다. 복잡한 작업을 수행하기 위해 협력하는 클라이언트는 동작을 조정하고, 작업을 재배포하거나, 시스템 성능과 안정성을 유지하기 위해 특정 책임을 맡아 서로의 LWT 메시지에 반응할 수 있습니다. LWT를 사용하기 위해 클라이언트는 연결 중에 CONNECT 패킷에 will 메시지, will 항목 및 나머지 will 속성을 지정할 수 있습니다. 클라이언트 연결이 갑자기 끊어지면 MQTT 브로커는 will 항목을 구독하는 모든 클라이언트에게 will 메시지를 게시합니다. 변동하는 연결 끊김으로 인한 노이즈를 줄이기 위해 클라이언트는 마지막 메시지 지연 간격을 0보다 큰 값으로 설정할 수 있습니다. 이 경우 클라이언트가 갑자기 연결을 끊었지만 지연 간격이 만료되기 전에 연결을 복원하면 마지막 메시지가 게시되지 않습니다.
사용자 속성
MQTT 브로커는 메시지 헤더에 사용자 지정 키-값 쌍을 추가하여 자세한 메시지 컨텍스트를 제공할 수 있는 MQTT v5 PUBLISH 패킷의 사용자 속성을 지원합니다. 사용자 속성의 사용 사례는 다양합니다. 수신자가 페이로드를 구문 분석하고 컴퓨팅 리소스를 저장하지 않고 메시지를 처리할 수 있도록 이 기능을 사용하여 메시지의 목적 또는 원본을 포함할 수 있습니다. 예를 들어 "경고"로 용도를 나타내는 사용자 속성이 있는 메시지는 "정보"를 목적으로 하는 것과 다른 처리 논리를 트리거할 수 있습니다.
요청-응답 패턴
MQTTv5는 요청-응답 패턴에서 응답 메시지에 대한 컨텍스트를 제공하는 MQTT PUBLISH 패킷 헤더에 필드를 도입했습니다. 이러한 필드에는 응답 토픽 및 사전 구성 없이 응답 시 응답기를 사용할 수 있는 상관 관계 ID가 포함됩니다. 응답 정보를 사용하면 명령 및 제어 시나리오에서 사용되는 표준 요청-응답 패턴에서 보다 효율적인 통신을 수행할 수 있습니다.
메시지 만료 간격:
MQTT v5에서 메시지 만료 간격을 통해 메시지 수명은 구성할 수 있습니다. 메시지 만료 간격은 메시지가 MQTT 브로커에 게시되는 시간과 MQTT 브로커가 배달되지 않은 메시지를 삭제해야 하는 시간 사이의 시간 간격으로 정의됩니다. 이 기능은 시간이 중요한 명령, 실시간 데이터 스트리밍 또는 보안 경고와 같이 특정 시간 동안만 메시지가 유효한 시나리오에서 유용합니다. MQTT 브로커는 메시지 만료 간격을 설정하여 오래된 메시지를 자동으로 제거하기 때문에 구독자는 관련된 정보만 사용할 수 있습니다. 메시지의 만료 간격을 0으로 설정하면 메시지가 만료되지 않아야 합니다.
토픽 별칭:
MQTT v5에서 토픽 별칭을 사용하면 클라이언트가 게시된 메시지의 전체 토픽 이름 대신 더 짧은 별칭을 사용할 수 있습니다. MQTT 브로커는 토픽 별칭과 실제 토픽 이름 간의 매핑을 유지 관리합니다. 이 기능은 네트워크 대역폭을 절약하고 메시지 헤더의 크기를 줄일 수 있습니다(특히 이름이 긴 토픽의 경우). 센서 네트워크와 같이 여러 메시지에 동일한 토픽이 반복적으로 게시되는 시나리오에서 유용합니다. MQTT 브로커는 최대 10개의 토픽 별칭을 지원합니다. 클라이언트는 PUBLISH 패킷에서 토픽 별칭 필드를 사용하여 전체 토픽 이름을 해당 별칭으로 바꿀 수 있습니다.
흐름 제어
MQTT v5에서 흐름 제어는 클라이언트가 처리할 수 있는 메시지의 속도 및 크기를 관리하는 메커니즘을 나타냅니다. 흐름 제어는 CONNECT 패킷에서 최대 패킷 크기 및 수신 최대 매개 변수를 설정하여 구성할 수 있습니다. 수신 최대 매개 변수를 사용하면 클라이언트가 브로커에서 보낸 메시지 수를 클라이언트가 처리할 수 있는 메시지 수로 제한할 수 있습니다. 최대 패킷 크기 매개 변수는 클라이언트가 받을 수 있는 패킷의 최대 크기를 정의합니다. MQTT 브로커의 메시지 크기 제한은 512KiB입니다. 이 기능은 처리 속도 또는 스토리지 용량이 제한된 제약이 있는 디바이스의 통신 안정성과 안정성을 보장합니다.
부정 승인 및 서버 시작 연결 끊기 패킷
MQTT v5의 경우 MQTT 브로커는 메시지 배달 또는 연결 오류에 대한 자세한 정보를 클라이언트에 제공하는 NACK(부정 승인) 및 서버 시작 연결 끊기 패킷을 보낼 수 있습니다. 이러한 기능은 클라이언트가 오류의 원인을 진단하고 적절한 완화 작업을 수행하는 데 도움이 됩니다. MQTT 브로커는 MQTT v5 사양에 정의된 이유 코드를 사용합니다.
현재 제한 사항
MQTT 브로커는 나중에 MQTT 사양에 맞게 MQTT v5 및 MQTT v3.1.1 기능을 더 추가할 예정입니다. 다음 목록에서는 MQTT 브로커에서 지원하는 기능과 현재 MQTT 사양 간 차이점을 자세히 설명합니다.
현재 MQTTv5 제한 사항
MQTT v5는 현재 다음과 같은 방식으로 MQTT v5 사양과 다릅니다.
- 공유 구독은 아직 지원되지 않습니다.
- 플래그 유지는 아직 지원되지 않습니다.
- 최대 지연 간격은 300입니다.
- 최대 QoS는 1입니다.
- 최대 패킷 크기는 512KiB입니다.
- 메시지 순서는 보장되지 않습니다.
- 구독 식별자는 지원되지 않습니다.
- 할당된 클라이언트 식별자는 아직 지원되지 않습니다.
- 토픽 별칭 최댓값은 10입니다. 서버는 현재 보내는 메시지에 대한 토픽 별칭을 할당하지 않습니다. 클라이언트는 설정된 제한 내에서 토픽 별칭을 할당하고 사용할 수 있습니다.
- CONNECT 요청에 요청 응답 정보 속성이 포함된 경우에도 CONNACK는 응답 정보 속성을 반환하지 않습니다.
- CONNECT, SUBSCRIBE, DISCONNECT, PUBACK, AUTH 패킷의 사용자 속성은 서비스에서 사용되지 않으므로 지원되지 않습니다. 이러한 요청 중 하나에 사용자 속성이 포함되어 있으면 요청이 실패합니다.
- 서버가 성공하지 못한 응답 코드가 있는 클라이언트에서 PUBACK을 받으면 연결이 종료됩니다.
- 연결 유지 최댓값은 1,160초입니다.
MQTTv3.1.1 현재 제한 사항
MQTT v5는 현재 다음과 같은 방식으로 MQTT v3.1.1 사양과 다릅니다.
- QoS2 및 보존 플래그는 아직 지원되지 않습니다. 보존 플래그 또는 QoS2가 있는 게시 요청에 실패하고 연결을 닫습니다.
- 메시지 순서는 보장되지 않습니다.
- 연결 유지 최댓값은 1,160초입니다.
코드 샘플:
이 리포지토리에는 원격 분석을 보내고, 명령을 보내고, 경고를 브로드캐스트하는 방법을 보여 주는 C#, C, Python 코드 샘플이 포함되어 있습니다. 샘플을 통해 만든 인증서는 테스트에 적합하지만 프로덕션 환경에는 적합하지 않습니다.
다음 단계:
ASIM에 대한 자세한 정보:
MQTT 브로커에 대한 자세한 정보: