Foundry
웹 크롤러 설계
고급
핵심

무엇을 먼저, 언제 다시

전수 재방문은 계산해 보면 불가능하다

예산이 월 10억 페이지 이고 보관이 누적 30억 페이지 입니다. 이 두 숫자를 곱해 보면 요구사항이 스스로 모순임을 알 수 있습니다.

전수 재방문은 불가능하다

보관한 모든 페이지를 월 1회 재방문하려면 예산의 세 배가 필요하다 월 예산 10억 페이지 전수 월 1회 재방문에 필요한 양 보관 30억이면 재방문만으로 예산의 세 배가 든다 그래서 전수 재방문은 처음부터 불가능하다 자주 바뀌는 것만 자주 본다. 나머지는 아주 드물게 본다 계산해 보면 요구사항이 스스로 모순인 경우가 있다

보관한 30억 페이지를 월 1회씩 다시 보려면 월 30억 번의 가져오기가 필요합니다. 예산의 세 배입니다. 신규 페이지를 하나도 안 가져와도 부족합니다.

그래서 "모든 페이지를 주기적으로 갱신한다" 는 요구는 성립할 수 없습니다. 계산해서 그것을 밝히는 것이 이 단계의 일입니다.

예산을 나눈다

예산을 신규와 재방문으로 나누고, 재방문 안에서도 차등을 둡니다.

구분배정근거
신규 발견절반범위를 넓히는 것이 이 크롤러의 목적
자주 바뀌는 페이지상당 부분뉴스와 목록 페이지
나머지남는 만큼아주 드물게 본다

배정 비율은 목적에서 나옵니다. 검색용이면 새 페이지를 찾는 것과 최신 상태를 유지하는 것이 모두 필요하고, 둘의 균형이 검색 품질을 정합니다.

얼마나 자주 바뀌는지는 관찰로 안다

미리 알 수 없으므로 다시 가져와서 비교합니다. 내용이 바뀌지 않았으면 다음 간격을 늘리고, 바뀌었으면 줄입니다.

바뀌지 않았다: 다음에는 더 늦게 본다
바뀌었다: 다음에는 더 일찍 본다

이렇게 하면 자주 바뀌는 페이지가 저절로 자주 방문되고, 죽은 페이지는 저절로 잊힙니다. 관찰이 정책을 만드는 구조입니다.

그리고 상대가 알려 주는 신호를 씁니다. 바뀌지 않았다는 응답을 받으면 내용을 받지 않으므로 예산을 거의 쓰지 않고 확인할 수 있습니다. 이 확인이 값싸다는 것이 재방문 설계의 핵심입니다.

무엇을 먼저 가져올지

새 주소가 늘 예산보다 많으므로 순서를 정해야 합니다.

신호
그 페이지를 가리키는 링크 수중요하다고 판단할 근거
호스트의 과거 품질쓸모 있는 내용을 내놓는 사이트인가
깊이사이트 첫 화면에서 얼마나 멀리 있나

이 신호들은 완벽하지 않습니다. 그래서 한 신호에만 의존하지 않고 섞습니다. 링크 수만 보면 서로 링크를 걸어 순위를 올리는 방식에 속습니다.

우선순위와 예의는 충돌한다

중요한 페이지가 한 호스트에 몰려 있으면, 우선순위대로 가져오려 해도 예의 규칙 때문에 초당 한 번씩만 가능합니다.

그래서 실제 순서는 두 규칙의 타협입니다. 우선순위는 어느 큐를 먼저 채울지를 정하고, 예의는 그 큐에서 꺼내는 속도를 정합니다. 두 층으로 나누면 서로를 방해하지 않습니다.

면접에서 이렇게 나옵니다

Q.모든 페이지를 월 1회 재방문하려면 어떻게 하나요

불가능합니다. 계산해 보면 예산의 세 배가 필요합니다.

보관 30억 페이지를 월 1회면 월 30억 번의 가져오기
예산은 월 10억 페이지
신규를 하나도 안 가져와도 부족하다

그래서 "모든 페이지를 주기적으로 갱신한다" 는 요구는 성립하지 않습니다. 계산해서 그것을 밝히는 것이 설계자의 일입니다.

대신 예산을 신규와 재방문으로 나누고, 재방문 안에서도 자주 바뀌는 것에 몰아 줍니다.

흔한 실수: 요구사항을 그대로 받아 설계를 시작하는 것. 숫자를 곱해 보면 불가능한 요구가 섞여 있는 경우가 있고, 그것을 먼저 말해야 나머지 설계가 의미를 갖습니다.

Q.어떤 페이지를 얼마나 자주 다시 보시겠습니까

다시 가져와서 비교하고, 결과에 따라 간격을 조절합니다.

얼마나 자주 바뀌는지는 미리 알 수 없습니다.

바뀌지 않았다: 다음에는 더 늦게 본다
바뀌었다: 다음에는 더 일찍 본다

이렇게 하면 자주 바뀌는 페이지가 저절로 자주 방문되고 죽은 페이지는 저절로 잊힙니다. 관찰이 정책을 만드는 구조입니다.

그리고 바뀌지 않았다는 응답을 받으면 내용을 받지 않으므로 예산을 거의 쓰지 않고 확인할 수 있습니다.

흔한 실수: 페이지 종류로 간격을 고정하는 것. 뉴스라고 다 자주 바뀌지 않고 오래된 기사는 그대로입니다. 관찰이 분류보다 정확합니다.

Q.새 주소 중 무엇을 먼저 가져오시겠습니까

여러 신호를 섞어 정합니다. 한 신호에만 의존하지 않습니다.

신호
그 페이지를 가리키는 링크 수중요하다는 근거
호스트의 과거 품질쓸모 있는 내용을 내놓는가
깊이첫 화면에서 얼마나 먼가

링크 수만 보면 서로 링크를 걸어 순위를 올리는 방식에 속습니다. 깊이만 보면 깊은 곳의 좋은 내용을 놓칩니다.

흔한 실수: 하나의 점수로 모든 것을 정리하려는 것. 점수를 만들려면 신호마다 가중치가 필요하고, 그 가중치를 정할 근거가 없으면 숫자에 근거가 없는 것을 감추는 셈입니다. 신호를 나눠 두면 어느 신호 때문인지 볼 수 있습니다.

Q.우선순위와 예의 규칙이 충돌하면 어떻게 하나요

두 층으로 나눕니다. 우선순위는 어느 큐를 채울지, 예의는 꺼내는 속도를 정합니다.

중요한 페이지가 한 호스트에 몰려 있으면 우선순위대로 가져오려 해도 초당 한 번씩만 가능합니다.

우선순위: 어느 호스트 큐에 주소를 넣을지 정한다
예의: 그 큐에서 꺼내는 간격을 정한다

두 층으로 나누면 서로를 방해하지 않습니다. 우선순위가 높아도 그 호스트에서 나오는 속도는 규칙이 정합니다.

흔한 실수: 우선순위를 지키려고 예의를 어기는 것. 그 호스트가 우리를 막으면 그 중요한 페이지들을 영구히 못 봅니다. 급한 것을 위해 자산을 잃는 선택입니다.

먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.

읽었으면 문제로 확인해보세요

웹 크롤러 설계 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.