발행-구독 메커니즘의 핵심 구조
MQTT의 발행-구독 패턴은 발행자(Publisher), 브로커(Broker), 구독자(Subscriber) 세 계층으로 분리됩니다. 발행자가 토픽에 메시지를 전송하면, 브로커는 해당 토픽에 대한 활성 구독자를 추적하고, 구독자의 토픽 필터와 일치하는 메시지만 전달합니다. 주요 특징은 발행자와 구독자가 직접 통신하지 않으며, 브로커가 모든 라우팅 결정을 수행한다는 점입니다.
토픽 필터와 와일드카드 메커니즘
구독자는 정확한 토픽명이나 와일드카드를 포함한 토픽 필터로 구독합니다. 단일 레벨 와일드카드(+)는 하나의 토픽 레벨과 일치하고, 다중 레벨 와일드카드(#)는 남은 모든 하위 레벨과 일치합니다. 브로커는 PUBLISH 패킷의 토픽명을 구독자의 토픽 필터와 문자 단위로 비교하여 메시지 전달 여부를 결정합니다.
서비스 품질(QoS) 레벨과 전달 보장
QoS 0은 최대 한 번의 전달(최선형)을, QoS 1은 최소 한 번의 전달을, QoS 2는 정확히 한 번의 전달을 보장합니다. 브로커는 구독자가 요청한 최대 QoS보다 높은 QoS로 메시지를 전송하지 않으며, 발행된 메시지의 QoS와 구독된 최대 QoS의 최솟값으로 전달됩니다. 특히 QoS 2는 PUBLISH-PUBREC-PUBREL-PUBCOMP의 4단계 핸드셰이크를 통해 중복 제거를 보장합니다.
브로커의 메시지 관리와 실무 주의점
브로커는 구독자가 없는 토픽에 발행된 메시지를 삭제하거나, 보유 기간(Message Expiry Interval)이 설정된 메시지는 만료 후 폐기합니다. 세션 상태 관리에서 QoS 1/2 메시지는 전달 완료 시까지 저장되며, 클라이언트 재연결 시 Clean Start 플래그에 따라 미처리 메시지가 재전송됩니다. 대규모 배포에서는 플로우 제어(Receive Maximum)를 설정하여 미승인 메시지 수를 제한하고, 공유 구독(Shared Subscription)으로 부하 분산을 구현할 수 있습니다.