Skip to content

extractor 링크 추출 처리 기한 추가 - #118

Merged
m-a-king merged 1 commit into
mainfrom
fix/117-extraction-deadline
Oct 15, 2026
Merged

m-a-king merged 1 commit into
mainfrom
fix/117-extraction-deadline

Conversation

@m-a-king

Copy link
Copy Markdown
Collaborator

한눈에

core 가 기다림을 포기한 뒤에는 extractor 가 렌더·LLM 을 새로 시작하지 않게 함

  • 이전: core 는 55초 안에 답이 없으면 연결을 끊고 같은 링크를 다시 요청함
    • extractor 는 끊긴 것을 모르고 렌더·LLM 단계를 끝까지 이어 감
    • 결과: 첫 요청과 재요청이 동시에 돌며 렌더 서버의 하나뿐인 렌더 자리를 다툼
  • extractor 가 요청마다 50초 기한을 잡음
    • 기한이 지나면 다음 렌더·LLM 단계를 시작하지 않고 일시 실패로 답함
  • 지금 부하에서는 동작 변화 없음(13일간 가장 오래 걸린 추출 19초)
  • 머지하면 extractor 가 prod 에 자동 배포됨

Situation

착수 후 확인

항목 값
파싱 결과 prod 123건·dev 29건
가장 오래 걸린 파싱 prod 19.3초·dev 9.9초
일시 실패 재시도 12건, 모두 수 초 안의 502
55초 타임아웃 0건
  • 최악 경로는 fetch, LLM, 헤드리스 렌더, LLM 순서
    • 단계별 상한 합은 200초를 넘음
    • 흔한 꼬리만 더해도 55초 초과 가능(fetch 3초, LLM 25초, 렌더 20초, LLM 25초)

Task

링크 추출에 처리 기한 추가

Action

요청마다 기한을 묶음

  • 링크 추출 요청이 들어오면 기한을 요청 범위 값(ScopedValue)으로 묶음
    • 기한은 계약의 호출자 read 타임아웃 55초에서 여유 5초를 뺀 50초
    • 계약 값은 proto 옵션에서 읽어 숫자를 복제하지 않음
  • 이미지 추출·단위 테스트처럼 기한이 묶이지 않은 호출은 검사하지 않음
  • 추출은 요청 스레드 하나에서 동기로 돌아 다른 스레드로 넘어가는 곳 없음

기한이 지나면 다음 단계를 시작하지 않음

  • 헤드리스 렌더로 넘어가기 직전과 LLM 호출 직전에 검사
  • 실패는 일시 실패 UPSTREAM_ERROR(502). core 는 재시도 대상으로 받음
  • 이미 진행 중인 단계는 끊지 않음
선택지 장점 비용
기한이 지났을 때만 시작하지 않음 (채택) 지금 55초 안에 성공하는 요청은 그대로 성공 50초 직전에 시작한 렌더는 최대 20초 더 자리를 잡음
남은 시간이 렌더 예산(22초)보다 적으면 렌더를 시작하지 않음 renderer 자리를 더 확실히 지킴 LLM 뒤 필드 부족으로 렌더로 넘어가는 경로가 성공에서 실패로 바뀜
core 가 남은 기한을 헤더로 보냄 기한 계산 위치가 호출자 한 곳 core 타임아웃이 고정이라 새 정보 없음. 세 repo 배포 필요
진행 중인 단계도 끊음 (스레드 interrupt) 자원을 가장 빨리 돌려받음 interrupt 가 일시 실패로 바뀌어 헤드리스 전환을 다시 일으키지 않게 막는 작업이 큼

Result

테스트

  • 기한 안·기한 지남·기한 없음 세 경우
  • 기한이 지났을 때 헤드리스로 넘기지 않고 escalation 지표도 오르지 않음
  • 기한이 지났을 때 LLM 을 부르지 않음
  • 링크 기한이 계약의 호출자 타임아웃보다 짧음
  • 위험: 기한 뒤에 끝난 단계의 결과는 여전히 버려짐. 막는 것은 새 단계 시작뿐

후속

  • infra 계약 문서의 타임아웃 예산 절에 이 규칙 반영
  • renderer 의 렌더 자리 대기(20초)가 extractor 렌더 read 타임아웃(20초)과 같아, 대기한 요청은 거의 항상 아무도 받지 않는 렌더가 됨

연관 이슈

- 링크 추출 요청마다 기한을 ScopedValue 로 묶음
  - 기한: 계약의 호출자 read 타임아웃(55초)에서 여유 5초를 뺀 50초
  - 이미지 경로·단위 테스트는 기한이 묶이지 않아 그대로
- 기한이 지나면 헤드리스 렌더·LLM 단계를 새로 시작하지 않음
  - 원인: core 는 55초에 끊고 재요청함. 그 뒤 시작한 단계는 받을 곳이 없고 재요청과 renderer 단일 슬롯·LLM 비용을 나눠 씀
  - 실패는 일시 실패 UPSTREAM_ERROR(502)
  - 진행 중인 단계는 끊지 않음
  - 대안: 남은 시간이 렌더 예산(22초)보다 적으면 렌더를 시작하지 않음
    - 기각: LLM 뒤 필드 부족으로 렌더로 넘어가는 경로가 지금은 55초 안에 성공하는데 실패로 바뀜
  - 대안: core 가 남은 기한을 헤더로 보냄
    - 기각: core 의 read 타임아웃이 고정이라 헤더가 새로 주는 정보 없음. 배포가 세 repo 로 늘어남
- redirect 홉 사이에는 검사하지 않음
  - 원인: 홉은 renderer·LLM 을 쓰지 않음. 열려 있는 SSRF 정리 PR(#112)과 같은 파일
@m-a-king m-a-king added the fix 외부 가시적 결함 수정 label Oct 15, 2026
@m-a-king m-a-king linked an issue Oct 15, 2026 that may be closed by this pull request
@m-a-king m-a-king self-assigned this Oct 15, 2026
@coderabbitai

coderabbitai Bot commented Oct 15, 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: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: b01bd8f1-8996-4253-8bb3-e8fda71299e5
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

@github-actions

Copy link
Copy Markdown

Discord 스레드 연동용 메타데이터입니다. discord-pr-bot 워크플로가 자동 생성하며, 수정·삭제하면 PR 과 Discord 알림 연동이 끊깁니다.

@m-a-king
m-a-king merged commit d7d08be into main Oct 15, 2026
5 checks passed
@m-a-king
m-a-king deleted the fix/117-extraction-deadline branch October 15, 2026 07:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

fix 외부 가시적 결함 수정

Projects

None yet

Development

Successfully merging this pull request may close these issues.

extractor 링크 추출 처리 기한 추가

1 participant