
MQTT 공식 로고
MQTT(Message Queueing Telemetry Transport)
2016년 국제 표준화 된 (ISO 표준 ISO/IEC PRF 20922) 발행-구독(Publish-Subscribe) 기반의 메시지 송·수신 프로토콜
Live 라는 하트비트와 Topic 에 발행되는 메세지를 통해 연결을 유지하고 메세지 송수신을 하게 됨0 : 최대 1회 전송. Topic을 통해 메세지를 전송할 뿐 보장은 하지 않음. (보낸 다음 잊어버림)1 : 최소 1회 전송. 구독하는 클라이언트가 메세지를 받았는지 불확실하면 정해진 횟수만큼 재전송.중복의 위험성 존재 (확인 응답을 거치는 전달)2 : 구독하는 클라이언트가 요구된 메세지를 정확히 한 번 수신할 수 있도록 보장. 메시지의 핸드셰이킹 과정을 추적.보장된 전달→ 0~1 정도의 QoS 를 사용하며 메세지 손실의 위험은 상위 어플리케이션 차원에서 관리하는 방법이 널리 쓰임
: 서버와의 연결을 기다린 다음, 노드 간 링크를 생성한다.
: MQTT 클라이언트가 해야 할 일을 기다리고 인터넷 프로토콜 스위트 세션의 연결이 끊어지기를 기다림
: MQTT 클라이언트에 요청이 전달된 직후 어플리케이션 스레드에 즉시 반환
C/C++/Java/Node.js/Python/Arduino 등 여러 종류로 브로커와 라이브러리가 존재

Single-Level Wildcard : +Multi-Level Wildcard : #[/] 문자로 시작하지 않도록 : [/home/sensor/humid] 이렇게 사용할 수는 있지만 최상위 토픽이 이름이 없는 토픽이 되므로 사용하지 않는 것을 권장공백을 사용하지 않습니다.ASCII 문자 만 사용. (임베디드 장치와의 호환성을 위해 주의)[#] 을 이용하여 토픽 전체를 구독하지 않도록. 오버헤드가 심할 경우 브로커/클라이언트 프로세스가 중단될 수 있음.MQTT 프로토콜 분석과 테스트 글 참조
대부분의 브라우저가 웹소켓을 지원하고 있음. 안정적인 연결을 수립할 수 있다.Connection에 대한 직접적 관리 가능다대다 전송이 용이PUBACK) 전송에 실패한 메세지를 주기적으로 재전송 할 수 있음오버헤드가 적고 저전력 환경에서도 동작이 가능WebSocket은 더 낮은 레벨의 통신 프로토콜이며, MQTT는 더 높은 레벨의 통신 방법론이기 때문에 사실은 비교할 수 없는 대상이다.
→ 웹 기반 환경에서 WebSocket 대신 MQTT를 사용한다는 것은 특별한 이유가 있을 때만 필요한 것이며, 그것이 아니라면 대부분은 WebSocket 하나만 사용하는 것이 더 가벼울 것
MQTT 는 사물인터넷(IoT)를 위한 프로토콜 ... 수백만 개의 IoT 장치와 연결하도록 확장할 수 있음
MQTT 는 디바이스의 리소스를 적게 사용하도록 설계되어 있고, 단방향 통신이 아니라, device와 cloud 간 송수신을 하는 양방향 통신을 지원한다.
→ HTTP 통신은 요청-응답 기반이어서 클라이언트가 먼저 요청을 보내야 서버와 통신이 가능함. 반면에 MQTT는 클라이언트 혹은 서버 둘 중 누구나 통신을 시작할 수 있음
다양한 사용자 + 디바이스 환경을 고려하면서 성능을 목표로 하는 경우.. MQTT의 Publish/Subscribe 구조를 고려해보는 듯 ?


우아한 형제들의 'MQTT 적용을 통하 중계시스템 개선' 글에서 적용 효과 부분을 살펴보면 간결, 정확성, API 서버 부하 및 트래픽 방지 등을 위해 소켓통신 대신 MQTT 를 채택하는 듯 하다.
웹 개발에서는 MQTT가 굳이 필요하지 않지만 서비스 개발에서도
'웹과 앱에서 모두 서비스 시키고 싶은 데.. 서비스 규모가 큰 경우' 채택을 많이 하는 듯 하다.
'+ 채팅 같은 양방향 소통이 필요한 서비스의 경우에
MES에도 이게 필요할 정도로 데이터가 쌓이나 싶기는 하지만,
조금 더 서버에 부하와 작업 시간을 줄이기 위해 MQTT를 도입하는 것 같다는 약간의 생각과 함께 MQTT 정리글을 마치도록 하겠다.