DOCS/journey/troubleshooting/250913_happybell80_daily_summary_duplicate_execution_fix.md
Claude-51124 22557e7132 docs: 오래된 트러블슈팅 아카이브 및 구조 정리
- 7-8월 초기 구축 문서 12개를 _archive/troubleshooting/2025_07-08_initial_setup/로 이동
- book/300_architecture/390_human_in_the_loop_intent_learning.md를 journey/research/intent_classification/로 이동 (개발 여정 문서)
- 빈 폴더 제거 (journey/assets/*)
2025-11-17 14:06:05 +09:00

2.3 KiB

Daily Summary 중복 실행 문제 해결

작성일: 2025-09-13
작성자: happybell80 & Claude
영향 서비스: robeing-gateway, rb8001
해결 상태: 완료

1. 문제 상황

증상

  • Daily Summary가 매일 아침 두 번 실행
    • 9시 0분: Gateway 크론잡 실행
    • 9시 1분: APScheduler 실행
  • 사용자들이 동일한 브리핑을 2번 수신

원인

  1. Gateway 크론잡: crontab에서 rb8001 API 호출
  2. APScheduler: rb8001 내부에서 직접 실행
  3. 두 시스템이 독립적으로 동작하여 중복 발생

2. 해결 방법

코드 수정

robeing-gateway/app/crontab.py

# 삭제된 내용:
# - 22줄: await briefing(logger) 
# - 23줄: logger.info("cronjob enrollment completed")
# - 25-100줄: async def briefing() 함수 전체

rb8001/main.py

# 삭제된 내용:
# - 549-583줄: @app.post("/api/cron/daily-summary") 엔드포인트 전체

환경변수 설정 (.env)

# Daily Summary 스케줄 설정
DAILY_SUMMARY_ENABLED=true
DAILY_SUMMARY_SCHEDULE=0 9 * * 1-5  # 평일 9시 0분 실행

3. 변경 후 구조

Before (중복 실행)

Gateway Crontab (9:00) → rb8001 API → dm_skill.send_daily_summary_dm()
APScheduler (9:01) → dm_skill.send_daily_summary_dm()

After (단일 실행)

APScheduler (9:00) → dm_skill.send_daily_summary_dm()

4. 확인 방법

# 1. Gateway 크론탭 확인 (briefing 항목이 없어야 함)
docker exec robeing-gateway crontab -l

# 2. rb8001 로그 확인
docker logs rb8001 | grep "Daily Summary"

# 3. 수동 테스트 (필요시)
curl -X POST http://localhost:8001/api/dm/send-daily-summary

5. 추가 개선사항

해결된 보안 취약점

  • Cron 토큰 하드코딩 제거 (cron-secret-2024)
  • 인증 실패시 요청 처리 계속되던 문제 해결

APScheduler 장점

  • 환경변수로 스케줄 관리
  • 내부 실행으로 네트워크 오버헤드 없음
  • 더 정확한 실행 시간 관리

6. 교훈

  1. 단일 책임 원칙: 스케줄링은 한 곳에서만 관리
  2. 환경변수 활용: 하드코딩 대신 설정 가능하게
  3. 중복 제거: Gateway와 내부 스케줄러 역할 명확히 구분
  4. 문서화: 시스템 변경사항 즉시 기록