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

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

AhnSeongHyun
March 18, 2018
1k

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

AhnSeongHyun

March 18, 2018
Tweet

Transcript

  1. MQTT 를 이용한 주문시스템 개선
    안성현
    @sh84ahn

    View full-size slide

  2. 발표자 소개
    • 안성현(AhnSeongHyun), Danal
    • Python Web Developer, Pythonista
    [email protected]
    • https://ash84.net
    • https://dev-meetup.github.io

    View full-size slide

  3. 목차
    • 기존 주문시스템의 문제
    • MQTT 소개 및 특징
    • 활용 : 주문 시스템 개선

    View full-size slide

  4. 기존 주문 시스템
    • 폴링 지옥 : 나는 너를 기다리고 있다.
    • 3초마다 주문확인
    • 1매장 1일 : 28800 = 60/3 * 60 * 24
    • 폴링 간격을 길게 잡으면 사용자가 주문하고 대기하는 시간의 증가
    • 매장이 늘어날수록 서버 부담 증가, 100 여개 이상
    클라이언트 서버
    새로운 주문이 있니?

    View full-size slide

  5. 고민과 해결책
    • 주문이 되는 시점에 주문정보를 줄 수는 없을까?
    • 폴링 지옥에서 탈출, 쿨한 관계로 가자.

    View full-size slide

  6. 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

    View full-size slide

  7. MQTT 특징 : PUB/SUB
    • 메시지를 발행하고 구독하는 방식으로 데이터 전송

    View full-size slide

  8. MQTT 특징 : TOPIC
    • 어디로 데이터를 주고 받을지에 대한 주소
    • 계층형(구분자 : /) 구성 가능

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  11. MQTT 특징 : QoS(Quality of Service)
    QoS : 2
    • 4단계의 핸드셰이킹(handshaking)을 통해 정확히 한 번만 전달
    • 제일 느림

    View full-size slide

  12. MQTT 서버 및 클라이언트
    https://github.com/mqtt/mqtt.github.io/wiki/software?id=software

    View full-size slide

  13. 새로운 프로젝트 : 무인로봇커피
    • 기존과는 다르게 주문을 받는쪽에도 별도의 서버 프로그램이 존재
    • Flask-MQTT 사용
    • 편하고 좋음.
    • 문제점 :
    • web app 이 여러개 뜨는 경우, paho client 도 여러개 뜬다.
    • Process=4 => 4개의 client가 subscribe 하는 형태, L4 구성의 경우 x2
    • 여러 클라이언트 동시에 같은 작업을 수행
    • 주문 완료시, 푸시 전송 > 8개가 수행
    중앙서버
    매장서버 브로커서버 주문전달
    주문전달
    구독 발행

    View full-size slide

  14. Shared Subscription
    • 같은 Topic 을 구독하는 클라이언트를 그룹핑
    • 하나라도 받으면 다른쪽에 보내지 않는 기능
    • MQTT 서버 별 기능 확인 필요

    View full-size slide

  15. EMQTT
    • http://emqtt.io/
    • Erlang 기반
    • Shared Subscription 지원
    • $share/group/topic
    • $queue/topic
    • 통계용 대쉬보드 지원, 플러그인
    • 자체 REST API
    • 문서화가 잘 되어 있음.

    View full-size slide

  16. 오픈 후 상황
    • 유실율 5% : 100잔을 팔면 5잔 데이터 유실에 의해서 취소처리됨.
    • 처음에 QOS:0 으로 설정
    • 테스트 할때에는 유실 없음.
    • 그러나 실환경에서는 주문 정보/주문 상태정보를 받지 못하는 문제 발생

    View full-size slide

  17. 대응
    • 일단 급하게 유실시, 데이터를 받지 못할때를 대비한 HTTP REST API를 제공
    • 그러나 일부 케이스는 여전히 문제
    • 결국 QOS:2 로 올리는 작업을 테스트
    • QOS:0 보다는 느리지만
    • 데이터 유실에 의한 취소 케이스는 없어짐.
    • 이 과정에서 Flask-MQTT 가 QOS:2 지정이 안되는 이슈 발생 => 오픈소스 기여

    View full-size slide

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

    View full-size slide

  19. Reference
    • http://woowabros.github.io/experience/2017/08/11/ost_mqtt_broker.html
    • https://en.wikipedia.org/wiki/MQTT
    • https://www.joinc.co.kr/w/man/12/MQTT/Tutorial
    • http://d2.naver.com/helloworld/1846
    • https://www.hivemq.com

    View full-size slide

  20. 감사합니다.

    View full-size slide