Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MQTT 를 이용한 주문 시스템 개선

AhnSeongHyun
March 18, 2018
1.1k

MQTT 를 이용한 주문 시스템 개선

AhnSeongHyun

March 18, 2018
Tweet

Transcript

  1. 기존 주문 시스템 • 폴링 지옥 : 나는 너를 기다리고

    있다. • 3초마다 주문확인 • 1매장 1일 : 28800 = 60/3 * 60 * 24 • 폴링 간격을 길게 잡으면 사용자가 주문하고 대기하는 시간의 증가 • 매장이 늘어날수록 서버 부담 증가, 100 여개 이상 클라이언트 서버 새로운 주문이 있니?
  2. 고민과 해결책 • 주문이 되는 시점에 주문정보를 줄 수는 없을까?

    • 폴링 지옥에서 탈출, 쿨한 관계로 가자.
  3. MQTT 소개 • MQTT(Message Queue for Telemetry Transport) • ISO

    standard (ISO/IEC PRF 20922) • 경량의 PUB/SUB 메시징 프로토콜 • TCP/IP protocol • M2M 또는 IoT 기기와 G/W의 연동을 위해 정의된 프로토콜, 제한된 환경을 위한 프로토콜 • Usage • Facebook Messenger • AWS IoT : https://aws.amazon.com/ko/iot-core/ • AZURE IoT Hub : https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-mqtt-support
  4. MQTT 특징 : TOPIC • 어디로 데이터를 주고 받을지에 대한

    주소 • 계층형(구분자 : /) 구성 가능
  5. MQTT 특징 : QoS(Quality of Service) QoS : 0 •

    한 번만 전달하고 전달 여부는 확인하지 않음(Fire and Forget) • 제일 빠른 속도
  6. MQTT 특징 : QoS(Quality of Service) QoS : 1 •

    적어도 한 번 이상 전달하고 전달 여부 확인(중복있음)
  7. MQTT 특징 : QoS(Quality of Service) QoS : 2 •

    4단계의 핸드셰이킹(handshaking)을 통해 정확히 한 번만 전달 • 제일 느림
  8. 새로운 프로젝트 : 무인로봇커피 • 기존과는 다르게 주문을 받는쪽에도 별도의

    서버 프로그램이 존재 • Flask-MQTT 사용 • 편하고 좋음. • 문제점 : • web app 이 여러개 뜨는 경우, paho client 도 여러개 뜬다. • Process=4 => 4개의 client가 subscribe 하는 형태, L4 구성의 경우 x2 • 여러 클라이언트 동시에 같은 작업을 수행 • 주문 완료시, 푸시 전송 > 8개가 수행 중앙서버 매장서버 브로커서버 주문전달 주문전달 구독 발행
  9. Shared Subscription • 같은 Topic 을 구독하는 클라이언트를 그룹핑 •

    하나라도 받으면 다른쪽에 보내지 않는 기능 • MQTT 서버 별 기능 확인 필요
  10. EMQTT • http://emqtt.io/ • Erlang 기반 • Shared Subscription 지원

    • $share/group/topic • $queue/topic • 통계용 대쉬보드 지원, 플러그인 • 자체 REST API • 문서화가 잘 되어 있음.
  11. 오픈 후 상황 • 유실율 5% : 100잔을 팔면 5잔

    데이터 유실에 의해서 취소처리됨. • 처음에 QOS:0 으로 설정 • 테스트 할때에는 유실 없음. • 그러나 실환경에서는 주문 정보/주문 상태정보를 받지 못하는 문제 발생
  12. 대응 • 일단 급하게 유실시, 데이터를 받지 못할때를 대비한 HTTP

    REST API를 제공 • 그러나 일부 케이스는 여전히 문제 • 결국 QOS:2 로 올리는 작업을 테스트 • QOS:0 보다는 느리지만 • 데이터 유실에 의한 취소 케이스는 없어짐. • 이 과정에서 Flask-MQTT 가 QOS:2 지정이 안되는 이슈 발생 => 오픈소스 기여
  13. 결론 • 폴링 지옥 탈출 • 설계시 주의 • 데이터의

    성격을 보고 TOPIC 과 QOS 를 설정 • 전달되는 정보가 어떤 성격인지, 필수인지 옵션인지, 데이터 사이즈 • 어떤 TOPIC 에 어떤 QOS를 설정할것인지 설계 • 파일 전송 : • MQTT 서버별 사이즈 제한 이슈 • 파일자체 주는 대신에 파일을 다운로드 받을수 있는 URL을 알려줌 • subs 쪽에서 URL 데이터를 받아서 다운로드 • 다양한 전송/QOS Negotiation 관련 설정 테스트 필요