Skip to content

파싱 요청 테이블 분리 (2단계) - #1083

Closed
m-a-king wants to merge 2 commits into
devfrom
refactor/1073-parse-requests-scheduler
Closed

m-a-king wants to merge 2 commits into
devfrom
refactor/1073-parse-requests-scheduler

Conversation

@m-a-king

@m-a-king m-a-king commented Sep 12, 2026 •

Copy link
Copy Markdown
Collaborator

Situation

Task

범위

Action

큐 이관

기능 이전 이후
집기 item_snapshots.status = PENDING parse_requests.status = PENDING
stale 회수 updated_at 이 임계 이전 heartbeat_at 이 임계 이전
마감 item_snapshots.created_at parse_requests.created_at
소유권·박동 item_snapshots.attempt_count parse_requests.attempt_count
워커·박동 레지스트리 키 snapshotId requestId
  • 잠금 방식은 그대로. FOR UPDATE SKIP LOCKED
  • 버전 id 는 지목 객체에만 잔존. 결과를 쓸 자리를 지목

시각 분리

  • 집기 시점에 heartbeat_at 을 함께 기록
    • 원인: 비워 두면 워커 제출이 거부된 요청이 stale 스캔에서 빠져 마감까지 방치
    • 이전: updated_at 하나가 집기·소유권 획득·박동 겸직

전이 원자성

  • 결과 전이가 요청 락을 먼저 잡고 버전 락을 뒤에 획득
    • 두 행을 함께 쓰는 경로가 전부 같은 순서. 교착 없음
  • 병합 재부모화에 요청 추가
    • 원인: 요청이 item_id 로 입력을 조인. 미추종 시 soft delete 된 loser 를 조인해 입력 없음으로 종결

버전 status 미러링 유지

  • 전이 가드를 강제하지 않고 현재 상태를 보고 건너뛰는 tolerant 전이
    • 원인: 카드 표시값이 아직 버전 status 를 조회
    • 조건: 배포 교체 구간에 옆 컨테이너가 버전을 선점. 가드 강제 시 배치 롤백으로 디스패치 정지
    • 후속: 4단계에서 묶음째 삭제

결정

결정 채택 대안 기각
배포 시 미완 작업 전부 종결 요청 생성 후 이어감 requested_by nullable 전환 필요
배포 교체 구간 감수 버전·요청 동시 잠금으로 교차 집기 차단 4단계에서 삭제될 코드
  • 비용: 배포 순간 진행 중이던 파싱 유실. 마감 3분이라 영향 구간이 좁음
  • 비용: 교체 구간의 중복 파싱 1회. 정합 영향 없음

구현

계층 식별자
도메인 ParseRequest 의 claim · release · succeed · fail
저장소 ParseRequestRepository 의 집기·stale·마감 조회와 소유권 두 연산
서비스 ItemParsingService · ParsingOwnership · ParsingHeartbeat
워커 ItemParsingWorker · ImageParsingWorker 와 두 구현체

Result

마감 종결 테스트 간헐 실패 소멸

후속


연관 이슈

@m-a-king m-a-king added the refactor 구조 개선, 외부 동작 불변 label Sep 12, 2026
@m-a-king m-a-king self-assigned this Sep 12, 2026
@coderabbitai

coderabbitai Bot commented Sep 12, 2026 •

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Advanced

Run ID: c2b0a72d-6ec2-4b8a-bd1f-51e454176518


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@m-a-king
m-a-king force-pushed the refactor/1073-parse-requests-scheduler branch 2 times, most recently from e872736 to 64692e3 Compare September 13, 2026 13:23
- 집기·stale 회수·마감·소유권·박동이 parse_requests 를 조회
  - 이전: item_snapshots 의 status·attempt_count
- stale 시계를 heartbeat_at 으로 분리. 집기 시점에 함께 기록
  - 원인: 비워 두면 워커 제출이 거부된 요청이 stale 스캔에서 빠져 마감까지 방치
  - 이전: updated_at 하나가 집기·소유권 획득·박동 겸직
- 결과 전이가 요청 락을 먼저 잡고 버전 락을 뒤에 획득
  - 두 행을 함께 쓰는 경로가 전부 같은 순서. 교착 없음
- 워커와 박동 레지스트리의 키를 requestId 로 교체
  - 지목 객체의 snapshotId 제거
    - 원인: 워커 인자가 requestId 로 바뀌며 마지막 소비자 소멸. 결과 버전은 요청이 보유
- 병합 재부모화에 요청 추가
  - 원인: 요청이 item_id 로 입력을 조인. 미추종 시 soft delete 된 loser 를 조인해 입력 없음으로 종결
- 버전 status 미러링은 tolerant 전이로 유지
  - 원인: 카드 표시값이 아직 버전 status 를 조회
  - 조건: 배포 교체 구간에 옆 컨테이너가 버전을 선점. check 강제 시 배치 롤백으로 디스패치 정지
  - 4단계에서 묶음째 삭제
- 마이그레이션으로 진행 중 버전 전부 종결, 1단계 요청 상태 백필
  - 원인: 요청 행이 없는 진행 중 버전은 새 스케줄러 눈에 안 보여 영구 정체
  - 비용: 배포 순간 진행 중이던 파싱 유실. 마감 3분이라 영향 구간이 좁음
- 요청과 결과 버전을 한 벌로 적재하는 헬퍼를 클래스별로 추가
- stale·마감 재현을 parse_requests 의 heartbeat_at·created_at 조작으로 교체
- 전이·소유권 호출 인자를 requestId 로 교체
  - 이전: snapshotId. 둘 다 Long 이라 컴파일은 통과하고 런타임에 실패
- 좀비 폐기 테스트의 정리 시점에 레지스트리 해제 대기 추가
  - 원인: 폐기 로그가 전이 트랜잭션 안에서 기록. 커밋 전 정리가 요청 행 락과 충돌
@m-a-king
m-a-king force-pushed the refactor/1073-parse-requests-scheduler branch from 64692e3 to a8793cc Compare September 13, 2026 13:27
@m-a-king

Copy link
Copy Markdown
Collaborator Author

#1176 으로 대체

  • 머지하지 않고 닫음
  • 원인: 버전 상태를 요청과 맞추는 동기화 코드가 다음 단계에서 지울 코드
  • 큐 기계는 새 에픽의 작업·대기열·임대 테이블 위에서 처음부터 다시 작성

@m-a-king m-a-king closed this Sep 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

refactor 구조 개선, 외부 동작 불변

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant