Overview

  • 하드웨어 연동과 AI 이물 검사 기능을 핵심으로 하는 식품 X-Ray 이물 검사 시스템 전면 재개발 프로젝트. LabView 윈도우 응용 프로그램을 MSA로 변경.
  • 크게 장비를 직접 통제하는 하드웨어 스택과 검사 수행에 필요한 비즈니스 로직과 검사 이력을 관리하는 애플리케이션 스택으로 나누어 서비스를 설계했습니다.

x-ray diagram

Technology

  • 하드웨어 스택에서는 Redis message broker를 중심으로 하드웨어 연동 전용 컨테이너들을 배치하고 해당 컨테이너들에 대해 TDD를 도입해 하드웨어에 의한 Pain point를 줄였습니다.
    • X-Ray의 눈 detector 컨테이너를 C++로 개발했습니다. bmp 표준을 준수하되 깊은 비트 심도를 나타낼 수 있는 형식을 고안하고, 다른 컨테이너가 mmap 프로토콜을 통해서 필요한 이미지 영역을overhead 없이 획득할 수 있도록 했습니다.
    • 나머지 하드웨어 연동 컨테이너의 Redis 인터페이스 설계와 Node.js TypeScript 객체 지향 설계를 주도했습니다.
  • 애플리케이션 스택에서는 에러 핸들링과 Canvas로 획득 이미지를 스트리밍하는 기능을 개발했습니다.

docker-compose services

Name Language Category Features
redis - Infra Event broker
nginx Nginx Infra Static server, Reverse proxy, 이미지 스트리밍
api Python Service CRUD, Auth, 이미지 처리 Microservice
orchestrator Node Service 하드웨어 상태 모니터링 및 통합 조작
detector C++ H/W Detector H/W 연동, 기초적인 이미지 처리
serial Node H/W 개별 시리얼 H/W 상태 관리자
postgres SQL DB 유저, 알고리즘 파라미터, 이미지 목록 관리
influxdb Flux DB 하드웨어 사용 이력 관리
s3 Node Infra mmap, 이미지 데이터 관리
ai Python Service 이물 검출 Yolo
firmware C++, Python Deployment IO controller firmware uploader

Lessons

  • 수많은 야근에도 불구하고 프로젝트의 목표가 달성 불가능한 목표로 설정된 탓에 Production에는 도달하지 못했습니다. 이 글은 프로젝트의 완성보다 제 커리어에서 가장 복잡한 문제를 MSA로 어떻게 풀려고 시도했는지를 중점으로 읽어주시길 부탁드립니다.
  • 객체를 통해 메모리를 간접적으로 관리하는 현대적인 C++ 개발을 경험했습니다. WebAssembly, pybind 등을 통해서 일부 기능을 Native하게 구동하는 데 관심이 있었는데, 이번 프로젝트에서 쌓은 C++ 경험을 기반으로 미래에 이러한 개발을 맡을 수 있으면 좋겠습니다.
  • Redis를 통한 하드웨어 추상화와 하드웨어에 대한 TDD가 효과적으로 작동했습니다.