예측 가능한 및 탄력적인 프로그램을 구축하기 위한 supervisor-tree 라이브러리
Source: Dev.to
주장
전투에서 검증된 아이디어, AI 잡동사니가 아님.
아키텍처를 설계하고 구현의 대부분을 직접 작성했습니다 (>80%). AI 도움은 주로 단위 테스트와 독립 유틸리티를 만드는 데 사용되었습니다.
저는 Runsmith를 공개합니다. 이는 Python 서비스/시스템을 위한 Erlang/OTP‑스타일 슈퍼바이저‑트리 프레임워크이며, 여러 장기 실행 프로그램으로 구성됩니다.
Runsmith가 제공하는 것
- 워커 추상화 – 각 단위는 명시적인 유한 상태 머신(FSM) 라이프사이클을 가진 워커가 됩니다.
- 슈퍼바이저 트리 – 모든 워커를 지속적으로 모니터링하여 정지, 타임아웃, 크래시 등을 감지하고, 재시작을 실패한 단위에만 제한함으로써 시스템의 나머지 부분은 계속 실행됩니다.
- 다양한 동시성 모델 – 워커는 스레드, 코루틴, 혹은 사용자 정의 실행 백엔드에서 실행될 수 있으며, 단순히 별도 프로세스만은 아닙니다.
- 세밀한 헬스 프로브 – 실패는 제약 위반이나 헬스 체크를 통해 감지되며, 비정상적인 프로세스 종료만으로 판단하지 않습니다.
- 중첩된 결함 도메인 – Erlang/OTP‑스타일 슈퍼바이저‑트리를 통해 계층적 결함 격리를 구현합니다.
탄생 배경
저는 제조 공장에서 사용되는 안전 보호 카메라 시스템의 백엔드를 구축했습니다. 이 시스템에서는 다운타임이 용납되지 않습니다. 시스템은 서로 영향을 주지 않으면서 무한히 실행되고 장애에서 복구해야 하는 여러 프로세스로 구성되었습니다:
- 웹 앱 – HTTP API와 Server‑Sent Events 스트림을 제공합니다.
- 알고리즘 워커 – 들어오는 프레임에 대해 컴퓨터 비전 추론을 수행합니다.
- 카메라 컨트롤러 – 카메라 디바이스 라이브러리와 상호 작용하고 프레임을 폴링합니다.
- 백그라운드 작업 러너 – 정기적인 데이터 정리와 같은 스케줄된 작업을 실행합니다.
- ONVIF 서비스
개발 과정에서 다음과 같은 문제를 겪었습니다:
- 알고리즘 워커가 서드파티 드라이버 오류로 인해 추론 중에 멈춤.
- FastAPI 웹 앱 이벤트 루프가 부실하게 작성된 동기 코드 때문에 스타베이션 현상이 발생.
첫 번째 구현은 상태 플래그, 재시도 로직, 워치독, 프로브가 뒤섞인 “지저분한 스프”였습니다. 동작은 했지만 유지보수와 이해가 어려웠습니다. 저는 감독이 일급 개념이고 결함 격리가 구조적으로 이루어지는 프레임워크가 필요했습니다.
Runsmith는 그 필요에서 탄생한 결과물이며, 장기 실행 및 상태를 유지하는 함수 단위를 모델링하기 위한 통합 구조입니다.
supervisord와의 비교
아니요, Runsmith는 supervisord가 아닙니다.
supervisord는 PID와 정적 설정을 통해 외부 프로그램을 관리하는 OS‑레벨 프로세스 제어 데몬입니다.- Runsmith는 프로세스 내부에서 동작하는, 프로그래밍 가능한 Python 라이브러리이며, 감독 대상은 명시적인 라이프사이클을 가진 타입화된 워커입니다.
supervisord에 비해 갖는 장점
- 다양한 동시성 모델 – 워커는 스레드, 코루틴, 혹은 사용자 정의 백엔드에서 실행될 수 있어 단순히 별도 OS 프로세스만은 아닙니다.
- 세밀한 헬스 프로브 – 실패는 제약 위반 및 헬스 체크를 통해 감지되며, 비정상적인 종료만으로 판단하지 않습니다.
- 슈퍼바이저‑트리 아키텍처 – 계층적 결함 격리를 위한 중첩된 결함 도메인을 지원하며, Erlang/OTP 접근 방식을 그대로 반영합니다.