o2o-negosium-original/lps/services/search
민헌 495e16b951 feat(lps): IP 를 태우지 말고 한계 직전까지 쓰고 쉬게 — 네이버 예산 상향 + 휴식 개념
기존엔 네이버가 쿠팡 기준 예산(3회)을 그대로 썼다. 실측하니 체급이 다르다:
같은 KR IP 로 **12회 연속 검색까지 무차단**(IP 4개 전부 한계 미도달). 3회로 돌리면
불필요하게 4배 자주 회전해 KR 풀만 빨리 소모하고 회전마다 브라우저 재기동(~20s)이 붙는다.
→ [DecodoConfig].naver_ip_request_budget = 10 (실측 12 에 여유). 쿠팡은 3 유지.

그리고 선제 회전에 빠져 있던 조각을 채웠다 — **휴식(rest)**:
예산 도달로 놓은 포트를 곧바로 다른 워커가 집으면 그 IP 의 요청률이 도로 올라가
예산의 의미가 사라진다. release(rest_sec=...) 로 sticky 수명만큼 쉬게 한다.
차단으로 태우는 burn(30분)과는 별개 상태다:
  휴식  탄 게 아님 · 짧음 · 소진 시 가장 먼저 회수
  쿨다운 차단당함 · 김 · 휴식보다 나중에 회수
회전 종류(kind)를 browser_base → DecodoProxy.rotate(kind) 로 전달해 budget 일 때만 휴식을 건다.

라이브 검증(예산 3으로 낮춰 관찰): 6회 검색 = IP 2개만 사용, 3회마다 선제 회전,
놓은 포트는 휴식 1 · 쿨다운 0 · 차단 0. 즉 IP 를 태우지 않고 로테이션만으로 돌아간다.

테스트 6건 추가(휴식 재사용 금지·만료 복귀·burn 우선·회수 우선순위·budget vs block),
전체 202 passed. _MockProxy.rotate 가 kind 를 받도록 갱신.
2026-08-05 11:16:37 +09:00
..
coupang feat(lps): 프록시 전송오류 IP회전 + 시작 프리플라이트 + DECODO/컴포넌트별 비용 2026-07-09 15:33:37 +09:00
esm perf(lps): Step2/3 — Turnstile 웜업·동적 차단 + 유휴 브라우저 정리 2026-07-09 20:20:58 +09:00
naver feat(lps): 알림 확장 — AlertManager 쿨다운·회복, DB풀 포화·소스별 장기실패 룰 2026-07-13 16:42:12 +09:00
naver_shop feat(lps): 네이버 최저가를 모바일 크롤로 복구(오픈API 종료 대체) 2026-08-05 09:05:38 +09:00
st11 perf(lps): Step1 — 폴백 데드라인 + fail-fast로 검색 지연 상한 2026-07-09 17:01:09 +09:00
browser_base.py feat(lps): IP 를 태우지 말고 한계 직전까지 쓰고 쉬게 — 네이버 예산 상향 + 휴식 개념 2026-08-05 11:16:37 +09:00
card_parser.py feat(lps): 오픈마켓 폴백 오케스트레이션 + 몰 dedup 2026-07-09 14:45:39 +09:00
contract.py feat(lps): 알림 확장 — AlertManager 쿨다운·회복, DB풀 포화·소스별 장기실패 룰 2026-07-13 16:42:12 +09:00
port_registry.py feat(lps): IP 를 태우지 말고 한계 직전까지 쓰고 쉬게 — 네이버 예산 상향 + 휴식 개념 2026-08-05 11:16:37 +09:00
proxy.py feat(lps): IP 를 태우지 말고 한계 직전까지 쓰고 쉬게 — 네이버 예산 상향 + 휴식 개념 2026-08-05 11:16:37 +09:00
rate_limiter.py feat(lps): 쿠팡 검색 어댑터 — Akamai 우회(Patchright) + 정규화 파서 2026-07-08 15:59:48 +09:00
util.py feat(lps): G마켓·옥션·11번가 크롤 어댑터 + 브라우저 어댑터 베이스 2026-07-09 14:41:05 +09:00