IoT Biz

기존 IoT 서버에는 하드웨어와의 통신 로직, 비즈니스 로직, DB 로직 등이 함께 있어서 간단한 로직 수정며칠이 걸리던 문제가 있었습니다. 또한 추상화가 전혀 되어있지 않아 하드웨어 프로토콜이 다른 서버까지 퍼져 하드웨어 도메인이 모든 시스템을 침범하고 있었습니다.
그래서 기존 IoT 서버를 IoT RelayIoT Biz로 새롭게 분리함으로써 다음을 달성할 수 있었습니다.
통신 로직을 IoT Relay로 분리하고 모든 비즈니스 로직을 IoT Biz로 가져와 서비스 순단 없이 비즈니스 로직을 수정하고 배포할 수 있도록 했습니다
하드웨어 도메인에 맞는 구조를 설계하여 손쉽게 프로토콜을 추가하거나 수정할 수 있도록 했습니다. 결과적으로 하나의 요구사항을 해결하고 배포하는데까지 걸리던 시간이 일주일에서 2~3시간으로 감소했습니다
IoT Biz와 IoT Relay가 Kafka를 통해 통신하게 함으로써 순간적인 부하에도 대응할 수 있도록 했습니다
Kafka를 통해 Biz 서버에 문제가 생긴 경우에도 메시지재처리해 하드웨어 상태를 정상적으로 동기화할 수 있도록 했습니다

작업 및 성과

하드웨어와 관련된 비즈니스 로직을 담당하고 추상화된 API를 제공하는 IoT Biz 서버 설계 및 개발
IoT Relay와의 통신을 담당하는 Communicator, 커맨드를 해석하는 Translator 설계구현
RedisSorted Set, Lua Script를 이용해서 여러 대의 IoT Biz 서버가 같은 프로토콜의 명령을 동시에 보내도 요청을 보낸 순서대로 각각 응답을 받을 수 있도록 구현했습니다
적은 사용자요청과 많은 하드웨어명령을 처리하는 서버를 분리 제안 및 구현
하드웨어의 명령이 밀려도 사용자의 요청은 처리되도록 개선
사용자의 요청이 밀려도 하드웨어의 상태 동기화는 영향을 받지 않도록 개선
하드웨어 비즈니스 로직이 여러 곳에 중복되던 문제를 이를 담당하는 서비스를 별도로 분리해서 해결
reflect-metadata를 이용해 Spring@EventListener처럼 이벤트를 다룰 수 있는 유틸리티 개발
모든 하드웨어 이벤트를 Confluent Kafka로 발행하도록 구현
UseCase 단위의 UUID를 추가해 하드웨어 이벤트UseCase 단위로 그룹화할 수 있도록 개선
IoT Biz와 IoT Relay 사이 요청에 UUID를 추가해 IoT Biz 이벤트와 IoT Relay 이벤트 그룹화할 수 있도록 개선
@type-cacheable의 어댑터를 수정하여 읽기 트래픽Replica Redis로 전달함으로써 Master Redis의 GET 명령을 약 70% 줄였음. 이로 인해 CPU %도 절반 수준으로 감소. 사진 참조
Redis에 캐시 되던 일부 설정을 로컬 메모리로 옮겨 Redis의 GET 명령을 약 85% 줄였음. 사진 참조
하드웨어 조작 중 일부 과정을 미리 수행하고 캐싱해 사용자의 이용을 시작하는데 걸리는 시간 4초에서 3초로 줄였음. 사진 참조
prom-client를 이용해 핵심 서비스 지표Grafana에서 확인할 수 있도록 구현
npm에서 pnpm으로 교체하고 일부 모듈을 AMI에 캐시해 아래와 같이 배포 및 스케일링 시간 단축
Request
배포 : 3~4분 → 1~2분
스케일 아웃 : 4~5분 → 2분
Noti
배포 : 1분 10초 → 50초
스케일 아웃 : 2분 30초 → 2분
신호 끊김 로직 개선
실제 킥보드 없이도 킥보드의 GPS를 시뮬레이션해 통합 테스트를 수행할 수 있는 마루더즈 맵 개발
IoT Biz와 IoT Relay가 통신할 때 Kafka가 아닌 Redis Pub/Sub을 이용하도록 무중단 마이그레이션. 문서 참고
AWS MSK 제거로 비용 월 200만원 절약
신호가 끊긴 하드웨어에게 통신하는 경우 항상 10초의 타임아웃이 걸리던 것에서 그 즉시 알 수 있도록 개선