2009-09-04 3 views
2

저는 멀티 스레드 Java 웹 크롤러를 작성하고 있습니다. 웹에서 이해할 수있는 것부터 사용자가 웹 페이지를로드하면 브라우저가 첫 번째 문서 (예 : index.html)를 요청하고 HTML을 받으면 다른 리소스 (이미지, CSS, JS)를 찾습니다.) 그 자원을 동시에 요청하십시오.얼마나 많은 Java HttpURLConnections를 동시에 열 수 있어야합니까?

내 크롤러가 원본 문서 만 요청하고 있습니다. 웬일인지, 나는 5 초마다 2 ~ 5 페이지 이상을 긁어 모을 수 없다. 내가 만들고있는 모든 HttpURLConnection에 대해 새로운 스레드를 돌리고있다. 나는 적어도 초당 20-40 페이지 긁어 모을 수 있어야하는 것 같습니다. 내가 100 개의 스레드를 돌리려고하면 나는 미친 듯이 I/O 예외를 얻는다. 무슨 일이야?

+1

많은 서버가 동일한 IP로 액세스하는 데 한계가 있음을 고려하십시오. 크롤러는 적어도 요청 사이에 0.5 초 또는 1 초 정도 기다리는 것이 일반적입니다. 또한 archive.org의 크롤러 인 Heritrix를 확인하십시오. 오픈 소스이며 Java로 작성되었습니다. 아주 좋아. –

답변

1

약간 잘못 생각하고 크롤러를 깨뜨린 것처럼 코드를 보는 것이 좋습니다. 그러나 비동기 IO을 수행하는 일반적인 규칙은 HttpURLConnection이 제공하는 차단 IO보다 훨씬 낫습니다. 비동기 IO를 사용하면 단일 스레드에서 모든 처리를 처리 할 수 ​​있으며 모든 실제 IO는 자체 시간에 운영 체제에서 수행됩니다.

비동기 IO를 통한 HTTP 프로토콜을 잘 구현하려면 Apache's HTTP core을 확인하십시오. 이러한 클라이언트의 예를 참조하십시오 here.

0

받은 IOExceptions에 대한 세부 정보는 유용 할 수 있습니다. 고려해야 할 몇 가지 가능성이 있습니다.

  • 오픈 파일 디스크립터 제한 (너무 많은 소켓)으로 이동합니다.
  • 주어진 서버에 대한 연결이 너무 많아서 연결이 거부되었습니다.
  • IO를 차단할 수 있기 전에 너무 많은 데이터를 가져 오는 것 (IO를 차단한다고 가정 할 때 - 100 개의 다른 서버에 대해 100 개의 요청을하면 갑자기 많은 양의 데이터가 다시 생성됩니다.) - HTTP GET 요청은 작은 -. 응답이 가능하지 효과적으로
  • 당신은 당신의 코드 :
0

에서 스레드의 가장 좋은 수를 바보 같은 실수를하거나 HttpUrlConnections 여러 가지 요인에 따라 달라집니다) 자신을 DDOS 수 있습니다.

  • 소유자가 아닌 외부 웹 사이트를 크롤링하는 경우 하나의 스레드 만 사용하고 지연해야합니다. 다른 경우에는 웹 사이트에서 DOS 공격을 감지 할 수 있습니다. 이 시간에 다른 웹 사이트를 크롤링하는 것이 좋습니다.
  • DOS 탐지가없는 자체 웹 사이트 인 경우 네트워크 지연에 따라 다릅니다. LAN에 웹 서버가 있으면 사용하는 CPU 코어의 수를 두 번 사용하는 것이 좋습니다. 웹 서버가 인터넷에 있으면 더 많은 스레드를 사용하는 것이 도움이 될 수 있습니다. 하지만 나는 100 개의 스레드가 커야합니다. 이것은 귀하의 웹 서버를 녹일 수 있습니다. 얼마나 많은 작업자가 웹 서버를 가지고 있습니까?
0

아, 그리고 연결에서 얻은 입력 스트림을 close()하고 싶습니다. 어쨌든 Connection의 종료 자 (finalizer)에서 닫히지 만 나중에는 몇 초가 걸릴 수 있습니다. 나는 그 문제에 대해 나 자신을 만났고 아마도 당신을 도울 것입니다.

관련 문제