2010-12-12 62 views
1

我們有10,000個博客,我們希望每天檢查多個新博文。我想用最有效的方式使用Perl來完成這個示例代碼。查看10,000條博客訂閱源的高效方法

目前我們只是使用LWP::UserAgent來下載每個RSS提要,然後檢查生成的提要中的每個URL,對照一次一個已找到的URL的MySQL數據庫表。毋庸置疑,這不能很好地擴展,並且效率超低。

在此先感謝您的幫助&意見!

+1

你見過http://superfeedr.com嗎? – 2010-12-12 23:44:58

+1

當你已經有一個較早的副本時,每當你下載一個完整的feed時,HTTP god就會殺死一隻小貓。請想想小貓。 http://google.com/search?q=Atom+conditional+GET – daxim 2010-12-13 06:36:29

回答

3

不幸的是,除了做某種投票之外,可能沒有別的辦法。

幸運的是,實施PubSubHubbub protocol可以極大地幫助減少支持它的提要的輪詢量。

對於那些不支持PubSubHubbub的提要,那麼您必須確保使用HTTP級別的協議(如ETagsIf-Modified-Since標題來了解資源是否已更新)。 還要確保你實現了某種退避機制。

2

也許看看AnyEvent::Feed,它是異步的(使用AnyEvent事件循環),具有可配置的輪詢時間間隔,並且支持「可見」文章以及對RSS和Atom提要的支持。您可能會創建一個進程輪詢每個Feed或多個進程,輪詢Feed列表的不同部分。

從簡介:

 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 /秒)。所以檢查你是否已經有一個網址應該非常快。從來沒有實際使用過它;)

  • 一個想法:你有沒有在解析RSS之前試過比較大小?如果更改不經常,可以節省一些時間。

0

10000沒有那麼多。

你也許可以處理然後用一些簡單的方法一樣分叉從數據庫獲取RSS網址一些工作進程,獲取他們並更新數據庫:

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); 

,考慮你是不是能夠使用一些其他響應者已經指出的現有應用程序。