본문 바로가기

IT 기타

[MQTT] MQTT는 그 많은 통신을 어떻게 계속 유지하는걸까?

반응형

통신에 대해 정확하게 모르기 때문에 순수하게 궁금했다.

MQTT도 똑같은 TCP 통신일텐데 계속 통신해서 유지해야하는거 아닌가 소켓처럼? 그러면 통신을 계속 유지 해야하니 힘들지 않나? 그것이 왜 되는가?? (소켓의 한계는 잘 모르지만..)

근데 많은 이들이 그냥 그런 애임.. 하고 그냥 넘어가고 그런걸 적은 사람이 없길래 한번 정리해봤다. (내가 못 찾은걸지도)

그냥 이곳 저곳에서 찾은 정보를 짜집기한거라 명확하지않을 수 있다.

정확한것은 좋은 자료가 있는곳을 찾아보고 알려줬으면 좋겠다. 나도 쉬운 자료 보면 공부하고싶다. ㅠ

1. MQTT란?

일단 하기 전에 MQTT에 대해 알아보자.

 

공식 사이트에선 아래와 같이 소개한다.

MQTT는 사물 인터넷(IoT)을 위한 OASIS 표준 메시징 프로토콜입니다.
작은 코드 풋프린트와 최소 네트워크 대역폭으로 원격 장치를 연결하는 데 이상적인 매우 가벼운 게시/구독 메시징 전송으로 설계되었습니다.
오늘날 MQTT는 자동차, 제조, 통신, 석유 및 가스 등 다양한 산업에서 사용됩니다.

출처: https://mqtt.org/ mqtt 아키텍처

 

사실 이것만 봐서는 심플한듯 뭔가 싶다. 아키텍처가 mqtt의 모든것을 표현하지만 모든것을 표현하지 못하는 느낌이랄까

 

나는 mqtt 사이트에서 있는 이 부분 Scale to Millions of Things가 어떻게 되는건지 너무 궁금했다.

aws - MQTT의 원리는 무엇인가요?

aws도 그냥 음 이런애다 정도로 소개를 하고있다.

더보기

MQTT 프로토콜은 게시/구독 모델의 원칙을 기반으로 작동합니다. 전통적인 네트워크 통신에서는 클라이언트와 서버가 서로 직접 통신합니다. 클라이언트가 서버의 리소스 또는 데이터를 요청하면 서버가 이를 처리한 후 응답을 다시 보냅니다. 그러나 MQTT는 게시/구독 패턴을 사용하여 메시지 발신자(게시자)와 메시지 수신자(구독자)를 분리합니다. 대신에 메시지 브로커라고 하는 제3의 구성 요소가 게시자와 구독자 간의 통신을 처리합니다. 이 브로커가 하는 일은 게시자로부터 수신되는 모든 메시지를 필터링하고 구독자에게 직접 배포하는 것입니다. 브로커는 게시자와 구독자를 아래와 같이 분리합니다.

공간 분리

게시자와 구독자는 서로의 네트워크 위치를 모르며 IP 주소 또는 포트 번호와 같은 정보를 교환하지 않습니다.

시간 분리

게시자와 구독자는 동시에 실행되거나 네트워크를 통해 연결되지 않습니다.

동기화 분리

게시자와 구독자는 서로를 중단시키지 않고 메시지를 전송하거나 수신할 수 있습니다. 예를 들어 구독자는 게시자가 메시지를 전송할 때까지 기다리지 않아도 됩니다.

 

  • 네트워크 통신 프로토콜
  • Publish-Subscribe 모델을 기반으로 설계
  • IoT, 메시징, 데이터 전송 등 여러 응용 분야에 최적화
  • 다양한 환경에 맞춰 서로 다른 브로커와 클라이언트 구현체가 개발 됨

2. 내가 생각한 MQTT

쉽게 말하자면 MQTT는 일단 프로토콜이라는것을 한번 더 인지를 해야한다.

MQTT의 설명을 보면 매우 가벼운 게시/구독 메시징 전송 이 있는데 이 가벼움이 정말 가볍다.

찾아보면 최소 2byte 로 통신이 가능하다고 한다. (이게 핵심 아닐까?)

이후 브로커와 클라이언트를 봐야하는데 이거 또한 빠르고 경량화된 브로커와 클라이언트들이 많다.

이게.. 그냥.. 핵심인것 같다..

그래서 다들 그냥 이런 애야 하고 끝나는듯 하다.

3. 다양한 MQTT 브로커

MQTT 브로커는 MQTT 프로토콜을 기반으로 동작하는 서버 소프트웨어로, 주요 역할은 다음과 같습니다:

  • 클라이언트 연결 관리.
  • 메시지 라우팅 및 전달.
  • 품질 보증(QoS) 처리.

다양한 목적에 맞는 여러 브로커가 존재합니다:

브로커특징 및 사용 사례

EMQX - Erlang으로 작성된 고성능 MQTT 브로커.
- 단일 서버에서 100만 개 이상의 연결 지원.
- 클러스터링 지원으로 확장성 제공.
Mosquitto - C 언어로 작성된 경량 MQTT 브로커.
- 소규모 IoT 시스템에 적합.
- 설치와 설정이 간단하여 학습용으로도 많이 사용.
HiveMQ - 상업용 고급 MQTT 브로커.
- 엔터프라이즈 환경에서 대규모 IoT 솔루션에 최적화.
- 클러스터링, 모니터링, REST API 지원.
VerneMQ - Erlang 기반 브로커.
- 대규모 연결 지원.
- 멀티 프로토콜 지원(MQTT, CoAP 등).
AWS IoT Core - AWS에서 제공하는 MQTT 기반 클라우드 서비스.
- IoT 디바이스와 클라우드 애플리케이션 간의 메시징 최적화.
RabbitMQ (MQTT Plugin) - 메시지 큐 플랫폼 RabbitMQ에서 MQTT를 지원하기 위한 플러그인.
- 기존 RabbitMQ와 통합 가능.
NanoMQ - EMQX에서 파생된 경량 MQTT 브로커.
- 리소스가 제한된 장치나 엣지 컴퓨팅 환경에 적합.

4. MQTT 클라이언트 라이브러리

MQTT 프로토콜을 사용하는 클라이언트를 구현하기 위해 여러 라이브러리가 존재합니다. 이를 통해 다양한 프로그래밍 언어와 환경에서 MQTT를 쉽게 사용할 수 있습니다.

라이브러리지원 언어특징

paho-mqtt Python, Java, C, etc. Eclipse 재단에서 제공하는 표준 라이브러리.
간단하고 사용하기 쉬운 API 제공.
asyncio-mqtt Python Python asyncio 기반 비동기 MQTT 라이브러리.
비동기 환경에서 적합.
MQTT.js JavaScript/Node.js Node.js 기반 MQTT 구현체.
브라우저와 서버 모두에서 사용 가능.
HiveMQ MQTT Client Java, Kotlin HiveMQ에서 제공하는 클라이언트 라이브러리.
고급 기능과 QoS 설정 지원.
mqtt_cpp C++ 고성능 C++ MQTT 클라이언트.
리소스가 제한된 환경에서도 효율적으로 동작.

5. MQTT 브로커와 클라이언트의 선택 기준

브로커 선택

  • 고성능이 필요한 경우: EMQX, HiveMQ, VerneMQ.
  • 경량화된 환경: Mosquitto, NanoMQ.
  • 클라우드 통합: AWS IoT Core.
  • 기업용 솔루션: HiveMQ, RabbitMQ MQTT Plugin.

클라이언트 선택

  • 언어 지원: 사용 중인 언어에 따라 적합한 라이브러리 선택(Python, Java 등).
  • 환경 요구사항: 비동기 처리가 필요한 경우 asyncio-mqtt 같은 라이브러리 선택.

 

참조

https://mqtt.org/

https://mqtt.org/getting-started/

https://aws.amazon.com/ko/what-is/mqtt/

반응형