refactor: 비정상 종료 시 PROCESSING 상태가 장시간 유지되는 문제 개선 - #53
Conversation
|
비정상 종료로 다만 현재 구현은 timeout이 지난 기존 요청을 실제로 무효화하지 않기 때문에, 오래 걸리는 기존 요청과 새 요청이 동시에 실행되면서 상태와 StudyTask를 서로 덮어쓸 수 있습니다. 머지 전에 아래 사항을 보완해야 할 것 같습니다. 1. 각 분석 실행을 구분할 수 있는 실행 식별자가 필요합니다현재는 예를 들면 다음 상황이 가능합니다. 현재
analysis_run_id = models.UUIDField(null=True, blank=True)처리 흐름은 다음처럼 구성하면 좋을 것 같습니다. run_id = uuid.uuid4()
# 시작 시 PROCESSING + run_id 저장
# AI 호출
# 작업 저장 전 DB의 run_id가 현재 run_id와 같은지 확인
# 성공/실패 상태 변경도 run_id가 같은 경우에만 허용기존 요청의 2. stale 재시도에도 최대 재시도 횟수를 적용해주세요현재 재시도 eligibility는 아래와 같습니다. Q(
analysis_status=MaterialStatus.FAILED,
analysis_retry_count__lt=MAX_RETRY_COUNT,
) | is_zombie_processing이 구조에서는 stale 재시도 횟수 조건을 전체 조건에 적용해야 합니다. eligible = (
Q(analysis_retry_count__lt=MAX_RETRY_COUNT)
& (
Q(analysis_status=MaterialStatus.FAILED)
| is_zombie_processing
)
)관련해서 3. 최초 분석과 재시도 양쪽에서 stale 상태를 구제하지 않는 것이 좋겠습니다현재 stale analyze_and_estimate()
retry_analysis()하지만 최초 분석 경로에서는 정책을 아래처럼 단순화하는 편이 명확해 보입니다. 화면에서 4. 기존 PROCESSING 데이터의
|
close #52
작업 내용
exams/models.py
StudyMaterial에 analysis_started_at(PROCESSING 진입 시각) 필드 추가
exams/services/analysis_orchestrator.py
PROCESSING_TIMEOUT_SECONDS = 300(5분) 상수 추가
_start_processing()이 기존 조건(PENDING / FAILED+재시도횟수남음) 외에도, "PROCESSING 상태로 5분 이상 경과한 좀비 상태"를 감지해서 최초 분석·재시도 양쪽 경로 모두에서 구제 가능하도록 조건 확장 (Q 객체로 OR 조건 처리)
PROCESSING 진입 시마다 analysis_started_at 갱신
get_analysis_status()에 is_stale(bool) 필드 추가 — 화면에서 "너무 오래 걸림" 표시/재시도 버튼 노출 여부 판단에 사용 가능
마이그레이션: exams/migrations/0003_studymaterial_analysis_started_at.py
exams/tests.py
ProcessingTimeoutTestCase 신규 추가 (7개)
PROCESSING 시작 시 시각 기록 확인
신선한(5분 안 지난) PROCESSING은 여전히 중복 요청 거부
좀비 PROCESSING은 최초분석/재시도 양쪽 경로로 구제 가능, 재시도 횟수도 정상 증가
is_stale 판정 3가지 케이스(좀비/신선/비-PROCESSING) 검증
검증 결과
python manage.py test exams.tests.ProcessingTimeoutTestCase → Ran 7 tests, OK
python manage.py test → Ran 158 tests, OK
manage.py check / makemigrations --check → 이상 없음