我的扒图工具开发过程(二)
上一节我们已经完成了基本功能的扒图工具了,但下载整个网站图片,单靠一个for循环跑不现实,看来要多开几个进程同时进行下载。第一个进程从for 0 to 500, 第二个进程从for 501 to 1000, 如此类推,要下完5000个系列图片要开10个进程下载。
我们将一个进程看成一个工人的话,那么我们就要请10个工人工作,这10个工人都要处理以下三个任务:
- 根据某系列图片首页网址
https://xxxx.com/xxx/${id}.html
,获取其内容,分析该系列图片的最大页数,并根据规律得到该系列图片的所有网页地址:https://xxxx.com/xxx/${id}.html~https://xxxx.com/xxx/${id}_${total}.html
- 获取这些网页内容,取得其图片地址
- 下载这些图片
每个任务又要有ErrorHandling的处理,每个进程的 任务就相对复杂了。就像一个手工作坊,以加大产量就要请大量工人,而且每个工人任务复杂,培养不容易。那么我们有什么可以改进的呢?
福特的流水线革命给了我灵感,如果将手工作坊改造成流水线,每个工人只负责一项任务,完成任务后,将输出交给流水线,另一个工人接收到处理完后,再交给流水线,这样每个工人处理的任务就会变得单一,代码逻辑就会变得简单,错误处理也就相对容易得多了。
那么扒图工具2.0改进就进行流水线改进,这个流水线叫做MQ (消息队列)。
待选流水线有以下几款:
- RocketMQ
- RabbitMQ
- ActiveMQ
- Redis
- Kafka
- ZeroMQ
最后综合各方面考虑因素,RabbitMQ凭着高可靠性,以及丰富帮忙文档胜出。虽然在吞吐效率方面比不上Kafka,但由于我的需求重点在可靠性方面及易上手方面,因此吞吐效率在这种需求下无优势。
MQ主要有两种基本方式:
- Topic
简单来说,广播式,发出去后只要subscript同一频道的都可以收到信息,信息发出后就会丢弃,不管是否有接收者收到。 - Queue
简单来说,队列式,发出去后只会有一个接收者抢到该信息,接收者处理完后才确定是否要丢弃。如果无接收者,该信息会一直保留在队列 。
此次改进为验证式改进,使用单一Qeueu方式处理信息。改进后流程如下图
下一节,将上详细代码。