问题:A网站抓取需要8个小时,B网站需要半个小时,如果A网站先开始那么B网站需要8个小时候才能执行到。如果A网站的紧迫性没那么高,只期望能慢慢的刷新譬如论坛网站,而B网站期望能尽快执行完毕。因此我们期望通过调配资源达到谋种和谐状态。
分析:若设置权重B权重高,A权重低,可以满足先执行B网站,但是如果A网站是循环任务,就会导致B网站永远获取不到资源。所以我们期望A网站每次执行的概率大,B网站执行任务的概率小。所以就转化为“权重to概率问题”。
设想方案参见:
简述:A、B、C三个网站的任务,权重分别设为:2、3、5,它们衍生出来的抓取请求分别排队入A、B、C队列(当然也可以拓展深度、广度算法,比较简单可自行按需拓展)。
这个图是当前任务权重池,新来添加完成移除。
每个线程获取任务时根据当前权重池的所有权重,随机一个随机因子看会落到哪个范围,然后从该范围对应的权重队列中获取任务执行。
任务分布式调度时最后几个请求被多个节点并行获取并执行时,很难区分到底是哪一个线程最后执行完毕并通知任务结束。采用from_que/to_que这种方案比较优。
并且若某个节点的任务执行一半宕机后,还可以从to_que中将任务恢复并重新拉入from_que中供执行,这些请求需要追加一个retry_times属性,重试多次后需要记录到failed_record表,供问题分析。
还可以从队列中查看待执行的任务、正在执行的任务、需要重试的任务等等做统计和展示。
此方案是针对爬虫分布式多网站抓取所涉及也适用于类似分布式调度, 若有好的建议可以深入讨论分析~