LWT로 MQTT 장애 감지 구현하기
MQTT의 LWT(Last Will and Testament)를 사용해 연결 종료나 비정상 단절을 빠르게 감지하고 복구 흐름을 설계하는 설정 및 예제 중심의 기술자료
목차
소개
IoT 시스템에서 클라이언트의 비정상 단절을 빠르게 식별하는 것은 안정성에 큰 영향을 준다. MQTT의 LWT(Last Will and Testament)는 브로커가 클라이언트를 대신해 미리 정의한 메시지를 발행하도록 해 단절을 알리는 표준 메커니즘을 제공한다. 이 글에서는 LWT의 동작 원리와 실제 설정 예제, 테스트 방법을 순서대로 설명한다.
LWT가 동작하는 원리
기본 개념
LWT는 클라이언트가 연결할 때 브로커에 등록하는 최후의 메시지다. 클라이언트가 정상적으로 DISCONNECT 요청을 보내지 못하고 연결이 끊기면 브로커가 해당 LWT 메시지를 지정된 토픽으로 발행한다. 이를 통해 다른 구독자들이 단절 상태를 인지할 수 있다.
동작 흐름
- 클라이언트 연결 시 LWT(topic, payload, qos, retain)를 등록
- 정상 종료: 클라이언트가 DISCONNECT를 보내면 LWT는 발행되지 않음
- 비정상 종료: 네트워크 장애나 프로세스 종료 등으로 브로커가 연결 소실을 감지하면 LWT 발행
- 구독자는 LWT를 받아 장애로 판단하고 복구 절차를 수행
왜 LWT를 사용해야 하는가
LWT는 폴링이나 별도의 헬스체크 신호를 줄이는 대안이다. 특히 전력이나 네트워크 환경이 불안한 임베디드 장치에서 유용하다. 또한 브로커 중심의 간단한 장애 알림이므로 확장성 측면에서도 효율적이다.
설정 예제
다음은 대표적인 클라이언트 라이브러리별 설정 예제다. 각 예제는 기본적인 LWT 설정만 포함한다.
mosquitto_pub (명령행)
mosquitto_pub -h broker.example.com -t "devices/abc/status" -m "offline" --will-topic "devices/abc/lastwill" --will-payload "offline" --will-qos 1 --will-retain
paho-mqtt (Python)
import paho.mqtt.client as mqtt
client = mqtt.Client(client_id="device-abc")
client.will_set(topic="devices/abc/lastwill", payload="offline", qos=1, retain=True)
client.connect("broker.example.com", 1883, 60)
client.loop_start()
# 정상 종료 시
# client.disconnect()
mqtt.js (Node.js)
const mqtt = require('mqtt')
const client = mqtt.connect('mqtt://broker.example.com', {
clientId: 'device-abc',
will: {
topic: 'devices/abc/lastwill',
payload: 'offline',
qos: 1,
retain: true
}
})
client.on('connect', () => {
// 연결 후 동작
})
// 정상 종료
// client.end()
테스트 방법
구성 후에는 LWT 동작을 직접 검증해야 한다. 테스트 절차는 단순하다.
- 구독자 시작: LWT 토픽을 구독해 메시지 수신 대기
- 클라이언트 연결: LWT로 등록하고 연결 유지
- 비정상 종료 시뮬레이션: 프로세스 강제 종료 또는 네트워크 차단
- 구독자에서 LWT 메시지 수신 여부 확인
운영 팁과 주의사항
Payload 설계
LWT 페이로드에는 상태와 타임스탬프, 장치 ID 같은 최소한의 정보를 포함한다. 메시지 형식은 JSON을 사용하면 파싱과 확장이 용이하다.
QoS와 Retain 설정
QoS는 메시지 전달 보장 수준을 결정한다. 장애 알림은 보장성이 중요하면 QoS 1 이상을 사용한다. Retain을 설정하면 재구독자도 마지막 상태를 즉시 확인할 수 있다.
브로커 구성 관련
일부 브로커는 세션 만료 시간, 연결 감지 주기 등을 조정할 수 있다. 적절한 keepalive와 세션 정책을 설정해 오탐을 줄이는 것이 중요하다.
실무 적용 시 고려사항
LWT는 단절 감지 수단일 뿐 복구를 자동으로 수행하지는 않는다. 수신 측에서 복구 절차(예: 재시작 명령, 알림 전송, 관리자 페이지 표시)를 설계해야 한다. 또한 LWT만으로는 부분 장애(센서 오류 등)를 알기 어려우므로 추가적인 상태 보고 체계를 병행하는 것이 권장된다.
요약
LWT는 MQTT 기반 시스템에서 간단하면서도 효과적인 장애 감지 수단이다. 올바른 payload 설계, QoS/retain 설정, 브로커 파라미터 조정이 핵심이다. 위 예제들을 참고해 개발 환경에 맞게 적용하면 비정상 단절을 빠르게 탐지하고 적절한 복구 흐름을 연결할 수 있다.