MQTT 구독 필터링과 Shared Subscription 활용
MQTT 구독 필터링과 Shared Subscription의 개념과 동작을 설명하고, mqtt 구독 필터링 예제와 shared subscription mqtt 사용법, 성능·장애 고려사항을 사례 중심으로 정리한 기술자료
목차
개요
IoT 환경에서 토픽 기반 메시지 분배는 트래픽 관리와 확장성에 핵심적인 역할을 한다. 이 글은 mqtt 구독 필터링 예제와 shared subscription mqtt 사용법을 바탕으로, Shared Subscription을 도입할 때의 동작 원리와 실무 고려사항을 명확하게 설명한다. 처음 접하는 독자도 이해하도록 단계별로 풀어쓴다.
토픽 필터와 와일드카드 개념
토픽 필터는 브로커가 어떤 메시지를 클라이언트로 전달할지 결정하는 규칙이다. MQTT는 두 가지 와일드카드를 제공한다.
단일 레벨 와일드카드: +
단일 레벨 와일드카드 '+'는 토픽의 한 레벨을 대체한다. 예를 들어 sensors/+/temperature는 sensors/room1/temperature, sensors/room2/temperature 등에 매칭된다.
다중 레벨 와일드카드: #
'#'는 해당 위치부터 모든 하위 레벨을 포함한다. sensors/#는 sensors 이하의 모든 토픽을 의미한다. 와일드카드 사용 시 브로커 성능과 메시지 수신량 증가를 고려해야 한다.
구독 필터 실전 예제
아래 예제는 일반 구독과 와일드카드 활용을 보여준다. mqtt 구독 필터링 예제로서 CLI와 코드 예시를 병행한다.
CLI 예제 (mosquitto_sub)
mosquitto_sub -h broker.example.com -t "sensors/+/temperature" -v
mosquitto_sub -h broker.example.com -t "sensors/room1/#" -v
Python(Paho) 예제
import paho.mqtt.client as mqtt
client = mqtt.Client()
client.connect("broker.example.com", 1883)
# 단일 레벨 와일드카드
client.subscribe("sensors/+/temperature", qos=1)
# 다중 레벨 와일드카드
client.subscribe("sensors/room1/#", qos=1)
client.loop_start()
Shared Subscription 개요
Shared Subscription은 하나의 토픽으로 들어오는 메시지를 여러 구독자(같은 그룹)에 분산 전달한다. 주로 소비자 수평 확장과 부하 분산을 위해 사용된다. 대부분의 브로커는 표준 형태로 '$share/{group}/{topic}' 문법을 지원한다.
동작 원리
- 같은 그룹에 속한 구독자들은 들어오는 메시지를 라운드로빈 또는 브로커 구현에 따른 방식으로 분배 받는다.
- 각 메시지는 그룹 내에서 단 한 명의 구독자에게만 전달된다.
- QoS는 구독자와 퍼블리셔 간의 합의로 결정되며, 보장 수준에 따라 재전송 동작이 달라진다.
Shared Subscription 사용 예제
아래 예제는 그룹 단위로 토픽을 분산 처리하는 방법을 보여준다. 실제 서비스에서는 그룹 이름 관리와 세션 유지에 유의해야 한다.
CLI 예제
# 두 개의 워커가 같은 그룹을 구독
mosquitto_sub -h broker.example.com -t "$share/workers/sensors/+/temperature" -v
mosquitto_sub -h broker.example.com -t "$share/workers/sensors/+/temperature" -v
Python(Paho) 예제
client.subscribe("$share/workers/sensors/+/temperature", qos=1)
운영 시 고려사항
Shared Subscription 도입 전후에 점검해야 할 항목을 정리한다.
설계 및 배포 체크리스트
- 그룹 네이밍 정책 수립: 안정적이고 중복 없는 그룹명을 사용한다.
- QoS 정렬: 퍼블리셔와 소비자의 QoS를 일관성 있게 설정한다.
- 세션과 클라이언트 ID 관리: 세션 끊김 시 그룹 내 재분배 동작을 테스트한다.
- 브로커별 동작 차이 확인: 일부 브로커는 Shared Subscription을 확장 방식으로 다르게 처리한다.
- 유지보수: 로그와 모니터링으로 메시지 손실, 지연을 관측한다.
주의점
- Retained 메시지와 Shared Subscription의 상호작용을 이해한다. 브로커에 따라 다르게 동작할 수 있다.
- 메시지 순서 보장: 그룹 간 분배는 순서 보장을 하지 않을 수 있으므로 설계 시 고려한다.
- 리소스 제한: 많은 수의 그룹과 구독은 브로커 메모리·스레드에 영향을 준다.
mqtt subscription best practice
효율적인 구독 관리를 위한 권장 사항이다.
- 명확한 토픽 네임스페이스 설계로 필터를 단순화한다.
- 필요한 최소한의 와일드카드만 사용한다.
- Shared Subscription은 처리량 요구가 높은 소비자에게 우선 적용한다.
- MQTT 5의 기능(예: Subscription Identifiers, Shared Subscriptions 확장)을 활용하면 운영 편의성이 개선된다.
요약
토픽 필터링과 Shared Subscription은 메시지 분배와 확장성 확보에 강력한 도구다. mqtt 구독 필터링 예제와 shared subscription mqtt 사용법을 통해 기본 동작을 익히고, QoS·세션·브로커 특성을 고려해 설계하면 안정적인 분산 처리 시스템을 만들 수 있다.