Azure Event Grid MQTT Broker의 공유 구독 개요

Azure Event Grid MQTT Broker의 공유 구독은 여러 클라이언트가 단일 토픽 구독의 메시지를 그룹으로 사용할 수 있도록 하는 메시징 패턴이며, 이를 통해 broker는 부하 분산된 방식으로 클라이언트 간에 메시지를 배포할 수 있습니다. 각 구독자가 모든 메시지를 받는 대신, 공유 그룹 내의 하나의 클라이언트만 각 메시지를 수신하여 백 엔드 처리 시스템의 확장성 및 처리량을 향상합니다.

공유 구독 작동 방식

표준 MQTT 구독에서 구독된 모든 클라이언트는 각 메시지의 복사본을 받습니다. 브로커는 공유 구독을 사용하여 클라이언트 그룹을 단일 논리 구독자로 취급하고 이러한 구독자 간에 메시지를 배포합니다.

  • 공유 필터와 일치하는 각 애플리케이션 메시지는 그룹 내의 활성 세션 하나에만 전달됩니다.
  • 배포는 일반적으로 그룹 내에서 임의 방식으로 부하 분산됩니다.
  • 클라이언트 세션에 공유 구독과 비공유 구독이 동시에 포함될 수 있습니다.
  • 여러 그룹이 동일한 토픽을 독립적으로 구독할 수 있습니다.

공유 구독 토픽 형식

공유 구독은 다음 형식을 사용합니다.

$share/{group-name}/{topic-filter}

구성 요소:

  • $share → 공유 구독 식별
  • {group-name} → 논리적 소비자 그룹
  • {topic-filter} → 토픽 또는 와일드카드 구독

Example:

$share/order-processors/retail/orders/#

주요 특징

  • 부하 분산 사용: 메시지는 효율적인 처리를 보장하기 위해 동일한 그룹의 클라이언트에 분산됩니다.
  • 수평 확장성: 소비자는 게시자에 영향을 주지 않고 독립적으로 확장할 수 있습니다.
  • 독립 소비자 그룹: 여러 공유 그룹은 각자 독립적으로 동일한 메시지를 받고 내부적으로 균형을 맞춥니다.
  • 혼합 구독 지원: 클라이언트는 동일한 세션에서 공유 및 비공유 구독을 모두 유지할 수 있습니다.

예제 시나리오: 소매 주문 처리

Event Grid MQTT Broker를 사용하는 소매 주문 처리 시나리오를 고려합니다.

  • 항목: retail/orders
  • 공유 그룹: order-workers
  • 클라이언트: Worker1, Worker2, Worker3

흐름:

  1. 주문은 retail/orders로 발행됩니다.
  2. 모든 작업자는 다음을 구독합니다. $share/order-workers/retail/orders
  3. Event Grid MQTT Broker 배포:
    • Order 1 → Worker1
    • Order 2 → Worker2
    • Order 3 → Worker3

각 주문은 한 번 처리되고 시스템은 수평으로 크기가 조정됩니다.

Event Grid MQTT Broker의 공유 구독 기능을 활용하여 세 명의 작업자에게 소매 주문 세 건을 효율적으로 배분하는 과정을 나타낸 다이어그램입니다.

프로토콜 동작 및 제약 조건

MQTT 버전 지원

  • MQTT 5 전용 기능
  • MQTT 3.1.1 클라이언트가 $share/...를 시도할 때 연결이 끊어집니다.

메시지 배달 의미 체계

  • 각 메시지는 그룹당 하나의 클라이언트로 배달됩니다.
  • 배달은 한 번 이상의 의미 체계를 따릅니다(QoS 1)

메시지 정렬

  • 그룹 구성원 간에 엄격한 순서 지정 보장 없음

세션 동작

  • 세션 만료는 메시지 배달에 영향을 줍니다.
    • 클라이언트 연결이 끊어지고 세션이 만료되면 메시지가 다시 할당될 수 있습니다.
    • 영구 세션은 안정성을 향상시킵니다.

Event Grid MQTT Broker의 사용 사례

공유 구독은 다음 작업에 적합합니다.

  • 처리량이 높은 IoT 원격 분석 처리: 여러 처리 서비스에 원격 분석 또는 이벤트를 분산합니다.
  • 백 엔드 작업자 풀/마이크로서비스: 무상태 서비스가 이벤트를 중복 없이 처리할 수 있도록 설정합니다.
  • UNS(통합 네임스페이스) 소비자: 처리량이 높은 산업용 데이터 스트림을 효율적으로 사용합니다.

공유 구독을 사용하는 경우

다음과 같은 경우 공유 구독을 사용합니다.

  • 병렬 메시지 처리가 필요합니다.
  • 단일 소비자는 부하를 처리할 수 없습니다.
  • 확장 가능하고 복원력 있는 아키텍처를 원합니다.
  • 사용자 지정 부하 분산을 빌드하지 않으려고 합니다.

토픽이 병렬 처리를 위해 여러 소비자에게 메시지를 배포하는 공유 구독을 보여 주는 다이어그램