我們有10,000個博客,我們希望每天檢查多個新博文。我想用最有效的方式使用Perl來完成這個示例代碼。查看10,000條博客訂閱源的高效方法
目前我們只是使用LWP::UserAgent來下載每個RSS提要,然後檢查生成的提要中的每個URL,對照一次一個已找到的URL的MySQL數據庫表。毋庸置疑,這不能很好地擴展,並且效率超低。
在此先感謝您的幫助&意見!
我們有10,000個博客,我們希望每天檢查多個新博文。我想用最有效的方式使用Perl來完成這個示例代碼。查看10,000條博客訂閱源的高效方法
目前我們只是使用LWP::UserAgent來下載每個RSS提要,然後檢查生成的提要中的每個URL,對照一次一個已找到的URL的MySQL數據庫表。毋庸置疑,這不能很好地擴展,並且效率超低。
在此先感謝您的幫助&意見!
不幸的是,除了做某種投票之外,可能沒有別的辦法。
幸運的是,實施PubSubHubbub protocol可以極大地幫助減少支持它的提要的輪詢量。
對於那些不支持PubSubHubbub的提要,那麼您必須確保使用HTTP級別的協議(如ETags
或If-Modified-Since
標題來了解資源是否已更新)。 還要確保你實現了某種退避機制。
也許看看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.
}
}
);
好像兩個問題集於一身:取一個比較。其他人已經回答了獲取部分。至於比較:
我一直在閱讀有關redis最近,它似乎是一個非常適合你,因爲它可以做很多每秒的簡單操作(可以說〜80K /秒)。所以檢查你是否已經有一個網址應該非常快。從來沒有實際使用過它;)
一個想法:你有沒有在解析RSS之前試過比較大小?如果更改不經常,可以節省一些時間。
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);
,考慮你是不是能夠使用一些其他響應者已經指出的現有應用程序。
你見過http://superfeedr.com嗎? – 2010-12-12 23:44:58
當你已經有一個較早的副本時,每當你下載一個完整的feed時,HTTP god就會殺死一隻小貓。請想想小貓。 http://google.com/search?q=Atom+conditional+GET – daxim 2010-12-13 06:36:29