MQTT 프로토콜
MQTT 이란?
Message Queue for Telemetry Transport 의 약자임
TCP/IP 프로토콜 기반 위에서 작동하고 IoT 기기를 위해 낮은 전력, 낮은 대역폭과 패킷량으로 통신하는 프로토콜이다. 기존 Pub/Sub 의 경량 프로토콜이라고 생각하면 좋을 듯하다. 가볍다 라는 장점은 존재하지만 QoS(서비스 품질)에는 제약이 있다. 저전력/소규모 디바이스를 위한 통신 프로토콜에 적합하기 때문에 IoT 에 적합한 프로토콜이다.
QoS란?
Quality of Service 의 약자로 서비스의 품질이라는 뜻을 내포하고 있고 총 3 단계를 지원하게 된다.
- 0 단계 : Topic 을 통해 Publisher가 최대 1회의 메시지 전송하는데 꼭 Subscriber 가 받는 다는 보장을 해주지 않음
- 1 단계 : 최소 1회의 전송하고 Subscriber 가 message 를 받았는지 불확실하면 정해진 횟수 만큼 다시 재전송 ( 중복 위험 )
- 2단계 : Subscriber 가 message 를 정확히 한 번에 수신할 수 있도록 보장함
Use Cases
Facebook Messanger, 우아한 형제들 ( 지금 사용하는지는 모르겠음 )
우아한 형제들 사례 ( 2017.08.11 )
기존 API Polling → MQTT 프로토콜로 변경함.
MQTT 적용을 통한 중계시스템 개선 — 우아한형제들 기술 블로그
MQTT Pub/Sub/Broker 구조
TCP 기반의 HTTP 프로토콜에서 사용하는 Client ↔서버 통신 방식이 아닌 아래와 같은 Broker, Publisher, Subscriber 의 구조로 되어있다.
MQTT Broker 의 역할
Network 가 단절 되지 않는 한 Socket 통신처럼 계속 디바이스와 연결을 MQTT Broker 가 Client 와 맺고 있음. 연결이 끊어진 이후에 계속 재접속을 지원하기 때문에 State 상태가 유지가 됨 또한 Cleint 에서 발생하는 Topic 별 message 를 받거나 Broadcasting 하기 위해 heartbeat check 을 클라이언트들에게 하는 역할을 담당함
Topic 발행(Publication) 과 구독(Subscription)
개설된 Topic 에 message 를 Pub 역할을 하는 클라이언트가 발행하면 Sub 역할을 하는 클라이언트가 해당 Topic 을 수신하여 처리할 수 있다. 1:N 1:1 메시지 전송이 가능하다.
클라이언트 개발을 위한 Library
클라이언트 개발을 위해 NodeJS, Python, Java, C 등 다양한 언어로 제공되고 있고 클라이언트 라이브러리 뿐만 아니라 Broker 또한 구성을 할 수 있도록 Library가 제공 된다. 대부분 유료의 경우 QoS 2단계를 지원하고 보통 QoS 1단계 까지만 지원한다.