1. 개요

MQTT는 경량의 Publish/Subscribe 처리를 위한, IoT 메시지 처리를 위한 경량 프로토콜이다. 대부분 소형이며 대역폭, 전원이 한정적인 원격 검침(telemetry) 환경에 사용하기 위해 처음 개발되었다고 한다. 따라서 많은 양의 동시 사용자 요청을 처리할 수 있다.

특징으로는,

  • 오픈 프로토콜이고, 가볍고, 유연하며, 심플하다.
  • 양방향의 async 방식의 푸시 통신이다.

푸시 방식은 서버와 TCP 채널을 열고 해당 채널을 통해 주기적 heartbeat을 실시하며 서버가 메시지를 푸시하면 클라이언트가 수신하는 방식이다. 주기적으로 폴링하지 않으므로 모바일 환경에서는 배터리 소모량 적고 네트워크 패킷도 적게 사용한다. 

Topic을 기준으로 Pub/Sub하게 되는데 Topic은 "/"를 이용하여 계층적 구성이 가능하기 떄문에 대량 센서 기기를 관리할 수 있다.

1999년 첫 버전이 작성되었다.

단 Job Queue 기능은 없다.


2. Method

2-1. Connect

Waits for a connection to be established with the server.

2-2. Disconnect

Waits for the MQTT client to finish any work it must do, and for the TCP/IP session to disconnect.

2-3. Subscribe

Waits for completion of the Subscribe or UnSubscribe method.

2-4. UnSubscribe

Requests the server unsubscribe the client from one or more topics.

2-5. Publish

Returns immediately to the application thread after passing the request to the MQTT client.


3. 구조

3-1. 헤더 사이즈

  • Publish : 2 ~ 14 bytes
  • Connect : 14 bytes

3-2. Keepalive 설정

2 byte PINGREQ / PINGRES


4. QoS

  • QoS 0단계 : 한번만 전달하고 전달여부 확인하지 않음
  • QoS 1단계 : 한번 이상 전달하고 전달 여부 확인함
  • QoS 4단계 : 4단계의 핸드셰이킹을 통해 정확히 한번 전달

5. 구현체

  • Mosquitto : C, 파이썬 기반, 오픈 소스
  • HiveMQ : 자바 기반, 상용

6. 사례

  • 페이스북
  • OpenStack
  • Azure

7. Kafka 연동

7-1. MQTT Broker 방식

Client - MQTT Broker - Connect w/ MQTT Connector - Kafka Broker - Kafka Consumer

Kafka Connect MQTT (https://www.confluent.io/connector/kafka-connect-mqtt/)는 MQTT Broker로부터 데이터를 주고 받기 위한 Kafka 플러그인임.

7-2. MQTT Proxy  방식

Client - MQTT Proxy - Kafka Broker - Kafka Consumer

중간에 MQTT Broker 없이 MQTT Proxy를 통해 직접 Kaka Broker에 데이터를 전송한다. Load Balancer를 사용하면 MQTT Broker를 Scale할 수 있으며 MQTT Broker가 필요 없기 때문에 비용이나 공수가 줄어든다.