MQTT란?
MQTT(Message Queuing Telemetry Transport)는 broker를 통해 subscription - publish 구조의 메세지 통신을 지원하며 QoS(Quality of Service)를 지원한다. 작성일 기준 5.0버전까지 존재한다.
Broker

Broker는 MQTT로 통신되는 메시지들을 수신하여 Publish 된 Topic 에 맞추어 Subscribe 된 대상들에게 메시지를 전달하는 역할을 하는 말그대로 중계자 역할입니다.
다양한 Broker들이 존재하며 이곳에서 대략적인 Broker별 지원 내역을 확인할 수 있습니다.(업데이트가 안된 정보도 있을 수 있음)
- Mosquitto : 서버 이중화로 인한 메세지 큐 문제로 EMQ로 변경하여 사용하였음
- EMQ : clustering 대신 shared subscription 을 통해 이중화 문제 해결
Clustering
노드간 발행 / 구독 관계를 공유하여 부하를 감소시킨다.

Shared subscription
기존에 구독되어있는 사람 모두에게 메세지가 전달 되는 상황을 순차적으로 입력받은 메세지를 하나의 구독자에게만 전달한다.

Publish / Subscribe

A가 X 라고 하는 Topic에 대하여 Subscribe한 경우, B가 X에 대해 Publish 하면 Broker에서 A로 해당 메세지를 중계해줍니다.
Topic
| 대상 | Topic |
|---|---|
| A | home/livingroom/sensor1 |
| B | home/kitchen |
| C | home/kitchen/sensor1 |
| D | home/kitchen/sensor2 |
| E | home/# |
| F | home/+/sensor1 |
Topic은 Publish 혹은 Subscription 할 대상을 지정합니다. / 을 구분자로 사용하여 각각의 Topic을 분리합니다. 와일드 카드로 + 와 # 가 있으며
Subscription이 A ~ D 까지 4개로 등록되어 있을때
| 송신Topic | 수신Topic |
|---|---|
| A | A |
| B | B |
| C | C |
| D | D |
| E | A, B, C, D |
| F | A, C |
위와 같은 대상이 메세지를 Publish된 메세지를 수신할 수 있습니다.
QoS
- QoS 0 : 송신자와 브로커는 패킷유실을 고려하지 않고 전송하기만 한다.
- QoS 1 : 수신자가 수신완료 응답을 반환할때까지 송신자는 여러번 재시도한다. 중복 메세지가 발생할 수 있다.
- QoS 2 : 송신자와 수신자는 handshaking을 통해 한번만 요청 / 처리가 된다. handshaking 에서 지연이 발생할 수 있다.

관련 라이브러리
Java
paho#
참조
- https://ko.wikipedia.org/wiki/MQTT
- https://www.semanticscholar.org/paper/Correlation-analysis-of-MQTT-loss-and-delay-to-QoS-Lee-Kim/f648e0c502776b41d8edc88e4f7789727c02b8fc
- https://randomnerdtutorials.com/what-is-mqtt-and-how-it-works/
댓글남기기