2010-12-12 2 views
1

우리는 새로운 게시물에 대해 하루에 여러 번 확인하고 싶은 10,000,000 개의 블로그가 있습니다. Perl을 사용하여 가장 효율적인 방법으로 예제 코드를 사용하여 몇 가지 아이디어를 얻었습니다.Perl에서 10,000 개의 블로그 피드를 확인하는 효율적인 방법

현재 우리는 각 RSS 피드를 다운로드 한 다음 결과 피드의 각 URL을 이미 찾은 URL의 MySQL 데이터베이스 테이블과 비교하여 확인하기 위해 단지 LWP::UserAgent을 사용하고 있습니다. 말할 필요도없이 이것은 확장 성이 좋지 않고 비효율적입니다.

도움을 주셔서 미리 감사드립니다 &!

+1

본 적이 있습니까 http://superfeedr.com? –

+1

이미 이전 사본이있을 때 전체 피드를 다운로드 할 때마다 HTTP god가 새끼를 죽입니다. 제발, 새끼 고양이를 생각해. http://google.com/search?q=Atom+conditional+GET – daxim

답변

3

불행히도, 어떤 종류의 폴링보다 다른 방법은 없을 것입니다.

다행히도 PubSubHubbub protocol을 구현하면이를 지원하는 피드의 폴링 양을 크게 줄일 수 있습니다.

PubSubHubbub를 지원하지 않는 피드의 경우 리소스가 업데이트되었는지 여부를 알기 위해 ETags 또는 If-Modified-Since 헤더와 같은 HTTP 수준 프로토콜을 사용해야합니다. 또한 어떤 종류의 백 오프 메커니즘을 구현해야합니다.

2

어쩌면 AnyEvent::Feed을 보면 구성 가능한 폴링 간격으로 비동기 적이며 (AnyEvent 이벤트 루프 사용) '본'기사에 대한 지원 및 RSS 및 Atom 피드 지원이 있습니다. 피드 목록의 여러 섹션을 폴링하는 모든 피드 또는 여러 프로세스를 폴링하는 단일 프로세스를 만들 수 있습니다. 시놉시스에서

: 비교 가져 오는 :

 use AnyEvent; 
     use AnyEvent::Feed; 

     my $feed_reader = 
     AnyEvent::Feed->new (
      url  => 'http://example.com/atom.xml', 
      interval => $seconds, 

      on_fetch => sub { 
       my ($feed_reader, $new_entries, $feed, $error) = @_; 

       if (defined $error) { 
        warn "ERROR: $error\n"; 
        return; 
       } 
       for (@$new_entries) { 
        my ($hash, $entry) = @_; 
        # $hash a unique hash describing the $entry 
        # $entry is the XML::Feed::Entry object of the new entries 
        # since the last fetch. 
       } 

      } 
     ); 
0

이 두 가지 질문이 하나에 압연 것 같다. 다른 사람들은 가져 오기 부분에 응답했습니다. 비교에 관해서는 :

  • 요즘에 대한 redis을 읽어 봤는데 그것은 초당 간단한 작업을 많이 할 수있는 당신을 위해 잘 맞는 것 같아 (~ 80K/s의 말을 할 수 있습니다). 따라서 이미 URL이 있는지 확인하는 것은 정말 빨라야합니다. 그래도 실제로 사용하지 마십시오;)

  • 아이디어 : RSS를 구문 분석하기 전에 크기 비교를 시도 했습니까? 변경 사항이 드물게 발생하면 시간을 절약 할 수 있습니다.

0

10000은 그리 많지 않습니다.

당신은 아마의 DB에서 RSS URL을 얻을 일부 작업자 프로세스를 분기와 같은 간단한 방법을 사용하여 다음 처리를 가져오고 데이터베이스를 업데이트 할 수

:

for (1..$n) { 
    my $pid = fork; 
    if (!$pid) { 
    defined $pid or die "fork failed"; 
    my $db = open_db(); 
    while (1) { 
     $url = get_next_url($db) or last; 
     $rss = feed_rss($url); 
     update_rss($db, $rss); 
    } 
    exit(0); 
    } 
} 
wait_for_workers(@pid); 

, 그 일부를 사용할 수없는 고려 이미 다른 응답자가 지적한 기존 애플리케이션의

관련 문제