[둥지] Celery Beat 도입기: 워커 크래시로 고착된 태스크를 자동으로 정리하기
워커 크래시/오프라인으로 PENDING·PROCESSING에 고착된 Celery 태스크를 자동으로 FAILED로 정리하기 위해 Celery Beat를 도입한 과정을 정리합니다. 워커 생존 감지 방법(Redis TTL vs PostgreSQL)과 stale 판정 기준을 중심으로 의사결정 근거를 기록합니다.
워커 크래시/오프라인으로 PENDING·PROCESSING에 고착된 Celery 태스크를 자동으로 FAILED로 정리하기 위해 Celery Beat를 도입한 과정을 정리합니다. 워커 생존 감지 방법(Redis TTL vs PostgreSQL)과 stale 판정 기준을 중심으로 의사결정 근거를 기록합니다.
SAN 프로젝트의 리콜 엔진을 오픈소스로 설계하면서 헥사고날 아키텍처와 레이어드 아키텍처를 비교하고, 도메인 기반 레이어드 구조를 선택한 과정을 정리합니다.

비동기 문서 발급 완료 상태를 프론트에 동기화하지 못해 무한 스피너가 발생한 문제를 분석하고, localStorage 타이머 우회책의 한계를 짚은 뒤 폴링·pending_since·celery beat 세 방안을 단계적으로 적용한 과정을 정리합니다.
property_type만으로는 표현할 수 없는 복잡한 체크리스트 조건(월세, 임대차신고제 등)을 처리하기 위해 DB 매핑 테이블을 버리고 코드 파이프라인 팩토리로 전환한 설계 결정 과정을 정리합니다.

팀장 겸 인프라 담당으로 두 대의 EC2 제약 환경에서 전체 시스템을 설계·운영하며 겪은 WebRTC ICE 타임아웃, MinIO Mixed Content, Spark 리소스 쟁탈 등 실전 트러블슈팅 기록입니다.
EC2 메모리 고갈의 원인이었던 mock-radar 컨테이너를 CSV 청킹 방식으로 전환해 메모리 사용량을 3.93GiB에서 72MiB로 줄인 트러블슈팅 기록입니다.

둥지 서비스의 비동기 알림 시스템을 설계하며 폴링, Redis Pub/Sub + SSE, PostgreSQL LISTEN/NOTIFY를 비교한 과정을 정리합니다. 최종적으로 Redis Pub/Sub + SSE를 선택한 이유와 Redis DB 번호 분리 전략까지 다룹니다.
spark-radar-stream이 리소스를 할당받지 못해 15초 간격으로 경고를 반복하는 문제가 발생했습니다. 코어 독식과 메모리 고갈 두 원인을 분석하고, spark.cores.max 설정과 잡별 메모리 할당으로 4개 Spark job이 워커 3GB 내에서 공존하도록 해결한 과정을 정리합니다.
CCTV 이미지가 브라우저에서 로드되지 않는 문제를 추적했습니다. s3:// 스킴 오류, Mixed Content 차단, 내부 hostname 접근 불가 세 가지 원인을 분석하고, MINIO_SERVER_URL과 nginx 프록시를 조합해 presigned URL 서명 불일치를 해결한 과정을 정리합니다.
둥지 프로젝트에서 등기부 발급 자동화와 OCR 처리를 담당하는 IssuanceTask / OcrTask의 비즈니스 로직 흐름을 정리합니다. DB 선행 vs Redis 선행 패턴의 의사결정 과정, 보상 로직 현황, 그리고 향후 Retry 정책 합의 내용을 다룹니다.