crawler-lib-golang · 2026

Go 수집기
기존 vs 변경

무엇이·왜·어떻게 바뀌었나 — 그리고 바뀐 수집 시퀀스

아래 ›(또는 점) 클릭으로 넘기기
1 / 10
왜 바꿨나

"누락"의 정체

누락 점검 스크립트는 이렇게 비교했다:

index Path → 소문자 DB PRODUCT_KEY → LOWER(product_key) 두 문자열이 같으면 found, 아니면 "not found(누락)"
→ index가 준 path는 "후보"일 뿐. worker가 go.mod를 봐서 진짜 module path로 저장해야 한다.
2 / 10
기존(V1)의 한계

옛 방식은 무엇을 못 했나

3 / 10
핵심

한눈 비교

항목기존 (V1)변경 (V2)
목록 grainindex path 1개당 1행, 버전 미저장(path, version) 이벤트당 1행, 버전 저장
식별·중복LOWER 비교 (대소문자 무시)해시 PK + as_cs (대소문자 구분)
존재 판단pkg.go.dev 의존 → 404면 누락proxy 기준 (pkg.go.dev는 metadata만)
대표 키index path 그대로go.mod declared module path
대소문자 모듈합쳐져 손실gatheringdb as_cs보존
재수집개념 약함RESYNC 컬럼 / GO_RESYNC_ALL
4 / 10
분석 결과 (보고서)

"누락처럼 보인" 6가지 → V2 처리

패턴예시V2 처리
proxy만 있음
(pkg.go.dev 404)
codeberg.org/go-toolbox/xproxy로 수집. @v/list 비면 @latest 한 개
declared가 index에 없음…/juxianjinggan/src2024-contexts…index path로 fetch, declared로 저장, index행 processed=6
alias .git…/latex.git…/latex.git행은 processed=6, 비-.git이 대표
subpath(하위 패키지)…/diana/widevine…/diana.mod의 module root를 대표 키로
대소문자eduVPN vs eduvpn별개 모듈로 보존, proxy는 ! escape
중복 index 이벤트같은 path 여러 번중복 제거 후 1회 판단
5 / 10
시퀀스 · 기존

옛 흐름 (index path 기준)

  1. index에서 Path 받음 (버전은 목록에 안 남김)
  2. Path.lower()LOWER(PRODUCT_KEY) 비교로 있나 확인
  3. 없으면 그 index path 그대로 수집 시도
  4. go.mod declared path 해결·alias/subpath 분기가 약함
결과: alias/.git · subpath · declared-diff · proxy-only 모듈이 "누락"으로 빠지거나 잘못된 키로 저장. 대소문자 다른 모듈은 합쳐짐.
6 / 10
시퀀스 · 변경

새 흐름 (V2 worker)

  1. 이벤트 (INDEX_PATH, INDEX_VERSION) claim
  2. DB에 이미 있으면 스킵 (단 RESYNC=1이면 건너뛰고 재수집)
  3. proxy에서 그 버전 go.mod fetch (없으면 @latest fallback)
  4. module 라인 → declared module path, store=declared or index
  5. 분류: same / alias_git / subpath / declared_diff
  6. version·product·license를 declared 기준으로 빌드
  7. 한 트랜잭션 저장 — 같으면 processed=1, 다르면 processed=6, deprecated=1
7 / 10
식별 · 대소문자

LOWER + ai_ci → 해시 PK + as_cs

기존

키 = index path 비교 = LOWER(...) (대소문자 무시) 저장 = ai_ci 테이블 → Foo/Bar 와 foo/bar 합쳐짐

변경

큐 PK = sha256(path@version) 식별 컬럼 = as_cs (대소문자 구분) 저장 = gatheringdb as_cs 테이블 → Foo/Bar 와 foo/bar 둘 다 보존
버전 테이블 ~1,900만 행 중 대문자 포함 경로 ~114만 건 — 이제 충돌 없이 보존.
8 / 10
존재 판단 · 용어

무엇을 "있다"의 기준으로?

processed=6 의 의미 — "수집 실패"가 아니라 "이 index path는 대표 키가 아니라서 declared module path 쪽으로 저장했다"는 표시.

9 / 10
요약

핵심 한 줄

index path를 소문자로 비교하던 방식 →
이벤트 단위 큐 + go.mod로 진짜 module path 해결 + 대소문자 구분 저장(proxy 기준 존재 판단)으로 바꿔
누락·오저장·대소문자 손실을 없앴다.

출처: docs/go-missing-index-path-report.md · ai/repo-notes/crawler-lib-golang.md
10 / 10