본문 바로가기

devops

MQTT/AMQP

MQTT (MQ Telemetry Transport)

MQTT는 경량의 Publish/Subscribe(Pub/Sub) 메시징 프로토콜이다. M2M(machine-to-machine)와 IoT(Internet of things)에서의 사용하려고 만들었다. IoT를 위해서 낮은 전력, 낮은 대역폭 환경에서도 사용할 수 있도록 설계됐다.

 

또한 MQTT는 저전력, 신뢰할 수 없는 네트워크, NO TCP/IP 기반에서 운용할 수 있다는 장점이 있다. 따라서 소형기기의 제어와 센서 정보 수집에 유리하며 이러한 특징들로 IoT 영역에서 주목받고 있다.

 

 출처 : https://www.joinc.co.kr/w/man/12/MQTT/Tutorial

 

MQTT의 특징을 살려서 낮은 적력에서 작동하는 Push 서비스를 만들 수 있다. 모바일 애플리케이션을 위한 메시지 Push 서버로 많이 사용된다.

 

Publish / Subscribe

MQTT 프로토콜은 특정 주제를 발행(publishing)하고 관심 있는 주제를 구독(subscribe)하는 것을 기본 원칙으로 한다. 이렇게 발행된 주제를 토픽이라고 하며, 이를 발행하고 구독하기 위해 중간에서 매개체가 되어주는, 브로커에 대한 역할을 하는 것이 MQTT 클라이언트이다. 하나 이상의 Pub와 Sub가 브로커에 연결해서 토픽을 발행하거나 구독할 수 있으며, 다수의 클라이언트가 하나의 토픽을 구독할 수 있다.

 

토픽(Topic)

토픽은 Publish / Subscribe의 기준이다. 토픽의 계층은 슬래시(/)로 구성할 수 있으며, 대량의 데이터들을 효율적으로 관리할 수 있다.

https://hyunalee.tistory.com/39

 

QoS(Quality of Service)

QoS는 서비스의 질을 보장해주는 레벨을의미한다. 간혹 불한 정한 네트워크로 인해 메시지가 손실되는 것을 방지하고 안정적으로 보내주기 위하여 사용된다.

 

그러나 모든 메시지를 항상 완변하게 보내야 할 필요는 없다. 크게 손실되어도 상관 없는 메시지를  보낼 때가 그 예이다. QoS는 이러한 경우를 위해 메시지 전송 상태를 보장하기 위한 등급(레벨)을 설정할 수 있게 해 준다.

  • QoS 0 : 메시지를 한 번만 전달하고 전달 여부는 확인하지 않음.
  • QoS 1 : 메시지를 적어도 한 번 이상 전달하고 전달 여부 확인
  • QoS 2 : 4단계의 핸드 셰이킹을 통해 정확히 한 번만 전달

발행자와 구독자 모두 QoS를 지정할 수 있으나 발행자가 지정한 최대 QoS 등급이 우선시된다. 예를 들어 발행자가 QoS 등급을 2로 지정했다면, 구독자는 0, 1, 2 중 어떤 수준으로도 구독할 수 있다. 하지만, 발행자가 QoS 등급을 0으로 지정했다면, 구독자는 QoS를 0으로만 받게 된다.

 

AMQP(Advanced Message Queuing Protocol)

MQTT는 이름에서도 알 수 있듯이 부하를 분산시키기 위한 Job Queue가 없다. 이러한 용도로는 보통 AMQP를 사용한다.

AMQP는 MQ의 오픈 소스를 기반으로 한 표준 프로토콜을 의미한다. 대표적으로 Erlang과 Java로 작성된 RaabbitMQ가 있다.

 

RabbitMQ

RabbitMQ는 AMQP를 구현한 메시지 브로커이다. 클러스터 구성이 쉽고 UI 기능과 다양한 플러그인도 제공된다.

게임 개발 관점에서의 MQTT 구성

게임 개발 관점에서의 MQTT 구성으로, 주제를 발행하는 주체로는 게임 서버, 구독을 하는 주체로는 클라이언트가 있다고 가정한다. 그 사이 브로커와 통신을 할 Node 서버를 추가한다.

 

 

Rabbit MQ Docker Compose 구성

version: "3.7"
services:
  rabbit1:
    image: lucifer8591/rabbitmq-server:3.7.17
    hostname: rabbit1
    ports:
      - "4379:4369"
      - "5772:5672"
      - "15772:15672"
      - "1883:1883"
    environment:
      - RABBITMQ_DEFAULT_USER=${RABBITMQ_DEFAULT_USER:-admin}
      - RABBITMQ_DEFAULT_PASS=${RABBITMQ_DEFAULT_PASS:-admin}
    volumes:
      - ~/.docker-conf/rabbitmq/data/1/:/var/lib/rabbitmq/
      - ~/.docker-conf/rabbitmq/log/1/:/var/log/rabbitmq
  rabbit2:
    image: lucifer8591/rabbitmq-server:3.7.17
    hostname: rabbit2
    environment:
      - CLUSTERED=true
      - CLUSTER_WITH=rabbit1
    volumes:
      - ~/.docker-conf/rabbitmq/data/2/:/var/lib/rabbitmq/
      - ~/.docker-conf/rabbitmq/log/2/:/var/log/rabbitmq
  rabbit3:
    image: lucifer8591/rabbitmq-server:3.7.17
    hostname: rabbit3
    environment:
      - CLUSTERED=true
      - CLUSTER_WITH=rabbit1
    volumes:
      - ~/.docker-conf/rabbitmq/data/3/:/var/lib/rabbitmq/
      - ~/.docker-conf/rabbitmq/log/3/:/var/log/rabbitmq

RabbitMQ 클러스터 구성을 위해 RabbitMQ 커스텀 이미지를 다운로드하여 구성.
Port 15672 -> RabbitMQ Web managment page
Port 5672 -> AMQP
Port 4369 -> EPMD (Erlang Port Mapper Daemon)
Port 1883 -> MQTT

 

참고

https://hyunalee.tistory.com/39

 

MQTT AMQP RabbitMQ

MQTT (MQ Telemetry Transport) MQTT는 경량의 Publish/Subscribe(Pub/Sub) 메시징 프로토콜이다. 네트워크가 불안정한 장소에서 작동하는 기능이나 힘이 약한 장치로 움직이는 기능을 위해 경화한 한 것이 특징

hyunalee.tistory.com

https://dalkomit.tistory.com/111

 

MQTT QoS(Quality of Service)

QoS 란? QoS는 서비스의 질을 보장해주는 레벨을 의미한다. 사물인터넷은 무선의 네트워크 망에서 통신한다. 와이파이, 지그비, 블루투스 등을 사용하는데 이러한 통신망은 아무래도 유선 통신보

dalkomit.tistory.com

 

'devops' 카테고리의 다른 글

[Redis] Redis Sentinel + HAproxy  (0) 2021.08.08
[Docker] Jenkins & fabric  (0) 2021.07.25
Volatile / Lock  (0) 2021.06.17
ASP.Net Core에서 NSwag 사용하기  (0) 2021.02.14
Dapper.Net - a simple object mapper for .Net  (0) 2020.12.16