Skip to content

extractor 사이트별 동시 요청 상한 추가 - #120

Merged
m-a-king merged 1 commit into
mainfrom
fix/119-site-concurrency-limit
Oct 15, 2026
Merged

m-a-king merged 1 commit into
mainfrom
fix/119-site-concurrency-limit

Conversation

@m-a-king

Copy link
Copy Markdown
Collaborator

한눈에

같은 쇼핑몰로 동시에 보내는 요청 수를 제한함

  • 이전: extractor 가 같은 쇼핑몰에 동시에 보내는 요청 수에 상한이 없음
    • 모든 요청이 extractor 서버의 고정 IP 하나에서 나감
    • 결과: 한 몰에 등록이 몰리면 몰이 우리 IP 를 막을 수 있고, 막히면 그 몰 등록이 전부 실패함
  • 같은 사이트로 동시에 나가는 요청을 2개로 제한함
    • 자리가 15초 안에 안 나면 일시 실패로 답하고 core 가 다시 시도함
  • 지금 부하(시간당 최대 8건)에서는 동작 변화 없음
  • 머지하면 extractor 가 prod 에 자동 배포됨

Situation

착수 후 확인

  • extractor 사이트별 동시 요청 상한 추가 #119
  • 지금 상한은 HTTP 커넥션 풀의 호스트당 5개뿐(라이브러리 기본값)
    • 풀이 넘치면 일시 실패로 바뀌어 헤드리스 렌더로 넘어감
    • 결과: 같은 몰을 렌더 서버 IP 로 다시 요청함

Task

사이트별 동시 fetch 상한 추가

Action

사이트 단위 세마포어

  • 사이트는 공개 접미사 목록 기준 등록 도메인
    • www·m 이 한 사이트. smartstore.naver.com 은 naver.com
  • 기본값 사이트당 2개, 최대 대기 15초
    • 설정 키 fetch.site-limit.max-concurrent·fetch.site-limit.max-wait
    • 15초는 링크 추출 기한(50초) 안에 fetch·LLM 몫을 남기는 값
  • 사이트 키가 늘어도 메모리가 자라지 않게 줄무늬 1024개의 약한 참조 세마포어 사용

자리를 못 얻으면 헤드리스로 넘기지 않음

  • 실패는 일시 실패 UPSTREAM_ERROR(502)
  • 기존 fetch 실패 타입이 아니라서 헤드리스 전환 판정에 걸리지 않음
    • 원인: 넘기면 같은 사이트를 렌더 서버 IP 로 다시 요청해 상한이 무력해짐

제한 위치

선택지 장점 비용
기본 추출 전략의 fetch 호출을 감쌈 (채택) 기존 fetch 코드 변경 없음 redirect 로 다른 사이트에 가도 처음 사이트 자리를 쥠
fetch 구현체를 감싸는 우선 빈 추출 전략 변경 없음 통합 테스트의 우선 대역 빈과 충돌
redirect 홉마다 제한 사이트별 정확 열려 있는 SSRF 정리 PR(#112)과 같은 파일

Result

테스트

  • 사이트 판정 7가지(하위 도메인·국가 도메인·단축 도메인·localhost·IP)
  • 같은 사이트 초과는 일시 실패, 다른 사이트는 바로 진행
  • fetch 가 실패해도 자리를 돌려줌
  • 통합 테스트가 실제 스프링 컨텍스트로 새 컴포넌트를 띄움
  • 위험: 정상 사용자가 한 몰 링크를 한꺼번에 많이 넣으면 일부가 대기 뒤 일시 실패할 수 있음
    • core 가 한 번 더 시도하고, 그래도 실패하면 FAILED

후속

  • 몰이 429(요청 과다)로 답할 때 헤드리스로 넘길지 결정 필요
    • 지금은 429 도 헤드리스 전환 대상이라 몰이 속도를 줄이라고 해도 다른 IP 로 바로 다시 요청함

연관 이슈

- SiteConcurrencyLimiter 추가. 정적 fetch 를 사이트별 세마포어로 감쌈
  - 사이트는 공개 접미사 목록 기준 등록 도메인(guava InternetDomainName). www·m 이 한 사이트
  - 기본값: 사이트당 2개, 최대 대기 15초(fetch.site-limit.*)
  - 원인: 몰 요청이 고정 IP 하나에서 나가 몰의 IP 단위 제한에 걸리면 그 몰 전체가 막힘
- 자리를 못 얻으면 SiteBusyException(UPSTREAM_ERROR 일시 실패)
  - PageFetchException 이 아니라서 헤드리스로 넘어가지 않음
  - 원인: 넘기면 같은 사이트를 렌더 서버 IP 로 다시 요청해 상한이 무력해짐
- 제한 위치는 DefaultProductLinkExtractor 의 fetch 호출
  - 대안: PageFetcher 를 감싸는 @primary 빈
    - 기각: 통합 테스트의 @primary StubPageFetcher 와 충돌
  - 대안: HttpPageFetcher 의 redirect 홉마다 제한
    - 기각: 열려 있는 SSRF 정리 PR(#112)과 같은 파일. 홉 사이 사이트가 바뀌는 체인은 짧음
- 줄무늬 1024 개의 약한 참조 세마포어
  - 원인: 사이트 키가 늘어도 메모리가 자라지 않음
@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: c4de9523-b65e-402f-a1a8-c46c5b3dfd60
  • 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 c12ceb7 into main Oct 15, 2026
5 checks passed
@m-a-king
m-a-king deleted the fix/119-site-concurrency-limit 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