好的,这里有简单的交易:我在网上蜘蛛网(所有类型的数据,博客/新闻/论坛)。然后我处理这个feed并对处理过的数据进行分析。 Spidering并不是什么大问题。随着互联网获取新数据,我可以实时获得它。处理是一个瓶颈,它涉及一些计算量很大的算法。
我正在制定策略来安排我的蜘蛛。最大的目标是确保作为最终结果产生的分析反映尽可能多的最近输入的影响。开始考虑它,明显的目标是确保数据不会堆积。我通过蜘蛛获取数据,传递给处理代码,等待处理结束然后蜘蛛更多。这一次带来了我等待处理时出现的所有数据。好的,这是一个非常广泛的想法。
你们中的一些人可以分享你们的想法,可能会大声思考。如果你是我,你会想到什么。我希望我对我的问题有所了解。顺便说一下,这不是一个搜索引擎索引。
答案 0 :(得分:1)
似乎你希望让处理器远远落后于蜘蛛。我想你也希望能够扩展它。
我的建议是使用客户端/服务器SQL数据库实现队列。 MySQL可以很好地用于此目的。
设计目标
<强>队列:强> 创建一个队列,以便在处理蜘蛛之前存储数据。这可以通过多种方式完成,但听起来并不像IO是你的瓶颈。
一种简单的方法是使用这种布局的SQL表:
TABLE Queue
Queue_ID int unsigned not null auto_increment primary key
CreateDate datetime not null
Status enum ('New', 'Processing')
Data blob not null
# pseudo code
function get_from_queue()
# in SQL
START TRANSACTION;
SELECT Queue_ID, Data FROM Queue WHERE Status = 'New' LIMIT 1 FOR UPDATE;
UPDATE Queue SET Status = 'Processing' WHERE Queue_ID = (from above)
COMMIT
# end sql
return Data# or false in the case of no records found
# pseudo code
function count_from_queue()
# in SQL
SELECT COUNT(*) FROM Queue WHERE Status = 'New'
# end sql
return (the count)
<强>蜘蛛:强>
所以你有多个蜘蛛程序..他们各自说:
if count_from_queue() < 10:
# do the spider thing
# save it in the queue
else:
# sleep awhile
repeat
通过这种方式,每只蜘蛛将休息或蜘蛛。决定(在这种情况下)是基于是否有少于10个待处理项目要处理。你可以根据自己的需要调整它。
<强>处理器强>
所以你有多个处理器进程..他们各自说:
Data = get_from_queue()
if Data:
# process it
# remove it from the queue
else:
# sleep awhile
repeat
通过这种方式,每个处理器将休息或处理。
总结: 无论您是在一台计算机上运行还是在20台计算机上运行,队列都将提供您所需的控件,以确保所有部件都保持同步,并且不会相互超前。