Foundry
웹 크롤러 설계
고급
핵심

방문할 목록 관리하기

발견이 크롤보다 빨리 자란다

호스트별 큐를 만들었습니다. 그 큐를 채우는 주소 목록이 이 절의 주제입니다. 크롤러에서 가장 크고 가장 다루기 어려운 자료입니다.

발견이 크롤보다 빨리 자란다

페이지 하나에서 여러 주소가 나오므로 방문할 목록이 크롤한 양보다 빠르게 자란다 페이지 하나를 가져오면 페이지 1개 새 주소 수십 개 대부분은 이미 본 것 그래서 목록이 이렇게 자란다 크롤한 양 10억 발견한 주소 중복을 걸러내지 않으면 목록이 먼저 터진다 본 주소를 기억하는 것이 목록 관리의 핵심이다 수십억 개를 메모리에 다 둘 수는 없다

페이지 하나에서 주소 수십 개가 나옵니다. 월 10억 페이지 을 가져오면 발견되는 주소는 그보다 훨씬 많습니다.

대부분은 이미 본 주소입니다. 사이트 안에서 서로 링크하기 때문입니다. 그래서 목록 관리의 핵심은 담는 것이 아니라 이미 본 것을 걸러내는 것입니다.

본 주소를 어떻게 기억하나

수십억 개의 주소를 그대로 기억할 수는 없습니다. 주소는 길고 개수가 많습니다.

방법비용
주소 전체를 담는다주소 하나가 수백 바이트. 수십억이면 수 테라
주소의 지문만 담는다하나에 8바이트. 수십억이면 수십 기가
있을 수 있는지만 값싸게 답한다메모리를 훨씬 덜 쓴다. 드물게 틀린다

지문만 담아도 메모리에 겨우 들어갑니다. 그래서 값싼 판정 장치를 앞에 두고 거기서 "없다" 고 하면 새 주소로 처리합니다. 키-값 저장소의 읽기 경로에서 본 것과 같은 장치입니다.

드물게 틀리면 이미 본 주소를 새 것으로 여겨 한 번 더 가져옵니다. 반대 방향으로 틀리지 않으므로 놓치는 주소는 없습니다. 이 비대칭이 여기서도 쓸모가 있습니다.

주소를 정규화한다

같은 페이지를 가리키는 주소가 여러 형태로 나옵니다. 끝의 빗금, 대소문자, 순서가 다른 질의 문자열, 추적용 매개변수가 그렇습니다.

정규화하지 않으면 같은 페이지를 여러 번 가져온다
목록도 그만큼 부풀어 오른다

어디까지 정규화할지가 판단입니다. 질의 문자열을 다 버리면 실제로 다른 페이지를 하나로 취급하고, 하나도 안 버리면 추적용 매개변수 때문에 같은 페이지가 수백 개로 늘어납니다.

목록을 어디에 두나

수십억 개를 메모리에 둘 수 없으므로 디스크에 둡니다. 그런데 큐에서 꺼내는 일은 빨라야 합니다.

담는 것
메모리지금 처리 중인 호스트 큐의 앞부분
디스크나머지 전부

앞부분만 메모리에 두고 뒤는 디스크에서 채웁니다. 순서대로 읽고 쓰므로 디스크에 유리한 접근입니다. 키-값 저장소에서 본 순차 쓰기의 이유와 같습니다.

목록이 사라지면 다시 시작해야 한다

크롤러를 재시작할 때 목록이 없으면 처음부터 다시 발견해야 합니다. 그러면 이미 가져온 페이지를 또 가져오게 되고 예산이 낭비됩니다.

그래서 목록은 크롤 결과보다 더 중요하게 지킵니다. 페이지는 다시 가져올 수 있지만, 목록을 잃으면 어디까지 했는지를 잃습니다.

면접에서 이렇게 나옵니다

Q.방문할 주소 목록에서 가장 어려운 것은 무엇인가요

이미 본 주소를 걸러내는 것입니다.

페이지 하나에서 주소 수십 개가 나오고 대부분은 이미 본 것입니다. 사이트 안에서 서로 링크하기 때문입니다.

월 10억 페이지 을 가져오면 발견 주소는 그보다 훨씬 많다
걸러내지 않으면 목록이 먼저 터진다

그래서 목록 관리의 핵심은 담는 것이 아니라 본 것을 기억하는 것입니다.

흔한 실수: 목록 크기를 저장 용량 문제로만 보는 것. 용량도 문제지만 같은 페이지를 반복해 가져오는 것이 예산 낭비입니다. 예산이 정해진 설계에서 그 낭비가 곧 못 본 페이지가 됩니다.

Q.수십억 개의 본 주소를 어떻게 기억하나요

값싼 판정 장치를 앞에 두고 지문만 담습니다.

방법비용
주소 전체하나에 수백 바이트. 수 테라
지문만하나에 8바이트. 수십 기가
있을 수 있는지만 답하는 장치훨씬 덜 쓴다. 드물게 틀린다

"없다" 고 하면 확실히 없으므로 새 주소로 처리하면 됩니다. 드물게 틀리면 이미 본 주소를 한 번 더 가져올 뿐이고 놓치는 주소는 없습니다.

이 비대칭은 키-값 저장소의 읽기 경로에서 쓴 것과 같습니다.

흔한 실수: 틀릴 수 있다는 이유로 이 장치를 쓰지 않는 것. 어느 방향으로 틀리는지가 중요합니다. 한 번 더 가져오는 것은 예산을 조금 쓰는 일이고, 놓치는 것과는 무게가 다릅니다.

Q.주소 정규화를 어디까지 하시겠습니까

추적용 매개변수는 버리고 의미 있는 질의는 남깁니다.

같은 페이지를 가리키는 주소가 여러 형태로 나옵니다. 끝의 빗금, 대소문자, 순서가 다른 질의 문자열이 그렇습니다.

다 버리면 실제로 다른 페이지를 하나로 취급한다
하나도 안 버리면 같은 페이지가 수백 개로 늘어난다

어디까지가 판단이고 정답이 없습니다. 그래서 규칙을 기록해 두고, 목록이 부푸는 원인을 볼 때 그 규칙을 조정합니다.

흔한 실수: 정규화를 한 번 정하고 끝내는 것. 사이트마다 매개변수를 다르게 쓰므로 새로운 부풀림 패턴이 계속 나타납니다. 목록에서 같은 호스트의 주소가 급증하는 것을 지표로 보면 그 패턴을 찾을 수 있습니다.

Q.목록을 어디에 저장하시겠습니까

앞부분만 메모리에 두고 나머지는 디스크에 둡니다.

담는 것
메모리처리 중인 호스트 큐의 앞부분
디스크나머지 전부

순서대로 읽고 쓰므로 디스크에 유리한 접근이 됩니다. 키-값 저장소에서 본 순차 쓰기의 이유와 같습니다.

그리고 목록은 크롤 결과보다 더 중요하게 지킵니다. 페이지는 다시 가져올 수 있지만 목록을 잃으면 어디까지 했는지를 잃고, 이미 가져온 것을 또 가져오게 됩니다.

흔한 실수: 목록을 임시 자료로 다루는 것. 재시작할 때 비면 예산이 낭비되고, 그 낭비는 못 본 새 페이지로 나타납니다. 눈에 보이지 않는 손실이라 더 위험합니다.

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

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

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