MQTT 메시지 만료로 저장 공간 관리
MQTT 메시지 만료 설정과 동작 원리, 브로커와 클라이언트 적용 방법, 저장 공간 최적화 전략을 초보자도 이해하기 쉽게 정리한 설명서
목차
개요
IoT 환경에서 메시지가 누적되면 브로커와 디스크 공간이 빠르게 늘어난다. MQTT의 메시지 만료(Message Expiry)는 이런 저장 공간 문제를 해결하는 핵심 수단이다. 본 글은 MQTT 메시지 만료의 개념부터 설정 방법, 운영 시 고려사항까지 초보자도 이해하기 쉬운 흐름으로 설명한다.
메시지 만료란 무엇인가
기본 개념
메시지 만료는 특정 시간 이후에 해당 메시지를 더 이상 전달하지 않거나 저장하지 않도록 하는 기능이다. MQTT 버전 5는 메시지 만료를 PUBLISH 패킷의 속성(Property)으로 제공한다. 이를 통해 브로커는 유효 기간이 지난 메시지를 자동으로 제거하거나 전달에서 제외할 수 있다.
왜 필요한가
- 저장 공간 절약: 오래된 메시지로 디스크와 메모리가 점유되는 것을 방지한다.
- 실시간성 유지: 센서 데이터처럼 최신 값만 의미가 있을 때 불필요한 재전송을 줄인다.
- 시스템 안정성: 큐나 세션에 쌓인 메시지로 인해 브로커 성능이 저하되는 일을 예방한다.
기술적 동작 방식
MQTT 버전 차이
MQTT v5는 Message Expiry Interval 속성을 통해 메시지별 만료 시간을 초 단위로 지정할 수 있다. 반면 MQTT v3.1.1에는 표준화된 메시지 만료 속성이 없어서, 동일한 기능은 브로커별 확장이나 애플리케이션 레벨로 구현해야 한다.
유효 범위
메시지 만료는 전송 도중 또는 브로커에 저장된 후의 동작에 영향을 준다. 예를 들어 유지(Retained) 메시지나 세션 큐에 쌓인 메시지에도 적용될 수 있다. 만료 시간이 지나면 브로커는 해당 메시지를 전달 대상에서 제외하거나 삭제한다.
설정 방법과 코드 예제
mqtt.js 예제 (MQTT v5)
Node.js 환경에서 mqtt.js 라이브러리를 사용할 때 PUBLISH 시 properties에 messageExpiryInterval을 지정하면 된다.
const mqtt = require('mqtt')
const client = mqtt.connect('mqtt://broker.example.com', {protocolVersion: 5})
client.on('connect', () => {
client.publish('sensors/temperature', JSON.stringify({temp:25}), {
qos: 1,
properties: { messageExpiryInterval: 60 } // 초 단위
})
})
일반 PUBLISH 패킷 예시 (MQTT v5 속성 구조)
{
topic: 'alerts/device',
payload: 'door_open',
qos: 1,
properties: {
messageExpiryInterval: 120
}
}
MQTT v3 환경에서의 대안
- 애플리케이션 레벨에서 타임스탬프를 붙이고 구독자가 수신 시 검증해 폐기
- 브로커의 플러그인이나 정책을 활용해 보관 기간을 설정(브로커별 기능)
- 유지 메시지는 주기적으로 재발행하거나 빈 페이로드로 삭제
운영 관점에서의 고려사항
만료 시간 설정 전략
- 센서의 갱신 주기와 데이터의 유효 기간을 기준으로 설정
- 중요 이벤트는 만료 시간을 길게 또는 미설정(무제한)으로 유지
- 주기적 데이터는 상대적으로 짧게 설정해 저장 공간을 확보
QoS와의 연동
QoS 0,1,2 모두에서 메시지 만료를 설정할 수 있지만, QoS가 높을수록 브로커와 클라이언트 간 재전송과 저장 동작이 복잡해진다. 예를 들어 QoS 1 또는 2로 세션 큐에 남은 메시지는 브로커가 만료 시간을 확인한 뒤 제거해야 한다.
유지(Retained) 메시지 관리
Retained 메시지는 새 구독자에게 최신 상태를 전달하기 위해 남겨진다. 그러나 오래된 retained 메시지가 시스템을 오염시키지 않도록 만료 정책이나 주기적 클린업이 필요하다. 일부 브로커는 retained 메시지에 대한 만료 정책을 별도로 제공한다.
실전적 운영 체크리스트
- 핵심 데이터와 보조 데이터의 만료 기준 분류
- 브로커(MQTT v5 지원 여부)와 클라이언트 라이브러리의 속성 지원 확인
- 만료 시간의 기본값 설정과 예외 정책 문서화
- 디스크 사용량과 메시지 큐 길이의 모니터링 설정
- 유지 메시지 수명 정책 또는 주기적 삭제 작업 구성
주의해야 할 점
- 모든 브로커가 MQTT v5의 모든 속성을 동일하게 구현하지 않는다. 브로커 문서를 확인할 것
- 만료 시간을 너무 짧게 잡으면 네트워크 지연이나 재시도 중인 구독자가 메시지를 놓칠 수 있다
- v3 환경에서는 애플리케이션 레벨 로직으로 보완해야 한다는 점을 간과하지 말 것
요약과 권장 설정
MQTT 메시지 만료는 저장 공간 관리와 실시간성 유지에 매우 유용하다. 가능한 경우 MQTT v5의 messageExpiryInterval을 활용하고, v3 환경에서는 타임스탬프 검증과 브로커별 정책을 병행하라. 또한 운영 중에는 모니터링과 주기적 검토로 만료 정책을 조정하는 것이 중요하다. 마지막으로 실제 환경에선 다음과 같은 기본 원칙을 추천한다.
- 주기적 센서 데이터: 짧은 만료 시간(예: 수십 초~수분)
- 상태 정보: 중간 길이(예: 몇 분~몇 시간)
- 이벤트/로그: 필요에 따라 길게 혹은 별도 보관소로 이관
위 원칙을 토대로 mqtt message expiry 설정, 메시지 만료 mqtt 사용법, mqtt 메시지 수명 관리 같은 키워드를 관심 사례에 맞게 적용하면 브로커 저장 공간을 효율적으로 관리할 수 있다.