我们有10,000个博客,我们想每天多次检查新帖子。我喜欢使用Perl以最有效的方式使用示例代码的一些想法。
目前,我们只是使用LWP::UserAgent下载每个RSS Feed,然后根据已找到的网址的MySQL数据库表逐一检查生成的Feed中的每个网址。毋庸置疑,这不能很好地扩展并且效率极低。
提前感谢您的帮助&咨询!
答案 0 :(得分:3)
不幸的是,除了做某种民意调查之外别无他法。
幸运的是,实施PubSubHubbub protocol可以极大地帮助减少支持它的Feed的轮询量。
对于那些不支持PubSubHubbub的Feed,您必须确保使用HTTP级协议(如ETags
或If-Modified-Since
标头来了解资源是否/何时更新)。
还要确保实现某种退避机制。
答案 1 :(得分: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.
}
}
);
答案 2 :(得分:0)
似乎有两个问题集合在一起:取一个比较。其他人已经回答了获取部分。至于比较:
我最近一直在阅读关于redis的内容,它似乎非常适合你,因为它可以每秒执行很多简单的操作(比如说〜80k / s)。所以检查你是否已经有一个网址应该非常快。从来没有实际使用它;)
一个想法:在解析RSS之前,您是否尝试过比较大小?如果不经常更改,可能会节省一些时间。
答案 3 :(得分: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);
考虑到你无法使用其他响应者已经指出的一些现有应用程序。