Overview
- 하드웨어 연동과 AI 이물 검사 기능을 핵심으로 하는 식품 X-Ray 이물 검사 시스템 전면 재개발 프로젝트. LabView 윈도우 응용 프로그램을 MSA로 변경.
- 크게 장비를 직접 통제하는 하드웨어 스택과 검사 수행에 필요한 비즈니스 로직과 검사 이력을 관리하는 애플리케이션 스택으로 나누어 서비스를 설계했습니다.
Technology
- 하드웨어 스택에서는 Redis message broker를 중심으로 하드웨어 연동 전용 컨테이너들을 배치하고 해당 컨테이너들에 대해 TDD를 도입해 하드웨어에 의한 Pain point를 줄였습니다.
- X-Ray의 눈
detector컨테이너를 C++로 개발했습니다. bmp 표준을 준수하되 깊은 비트 심도를 나타낼 수 있는 형식을 고안하고, 다른 컨테이너가 mmap 프로토콜을 통해서 필요한 이미지 영역을overhead 없이 획득할 수 있도록 했습니다. - 나머지 하드웨어 연동 컨테이너의 Redis 인터페이스 설계와 Node.js TypeScript 객체 지향 설계를 주도했습니다.
- X-Ray의 눈
- 애플리케이션 스택에서는 에러 핸들링과 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가 효과적으로 작동했습니다.