体会
- 代码结构
将所有全局变量封装,让依赖共同变量的模块解耦。 - 资源
定期删除下载的文件,文件保留时间可配置 - 流控
收发任务流控限制,判断队列大小,当发送后响应里面有SUCCESS才不重新塞回任务队列,当任务队列超过限制,不再取任务,等待;
批量获取任务和批量递交任务给爬虫,取任务url带“&num=5”,递交给爬虫是一个list,环节中的失败包括打包失败、发送任务失败,一起处理塞回队列 - 异常判断
细化各个环节的判断,如fetch时需要判断取回的数据是否有None,有“List”,有效任务类型,有效任务内容;处理爬虫回调内容格式是否正常,不正常回400,正常再判断是否有task_id,有result,有url;任务处理环节下载文件可能抛异常,检查文件大小(太小丢回任务队列),解析,连Hbase(失败会重试),写Hbase,通知调度
核心模块
- [SETTING]
可配置项写入Setting, 可从ETCD更改配置,如url地址,最大失败尝试次数,线程进程等待时间、检查时间,更新配置时间,Redis地址 - [CONST]
常量 - [STAT]
封装统计类,调用start方法开始统计线程,用队列和Redis实现统计。 - [SCHEDULER]
增加结果通知scheduler功能,包括成功和失败。 - [HBASE]
数据写入Hbase,考虑hbase重连,尝试次数有上限。
增加Hbase记录失败任务,对于所有写入的数据增加一个爬虫标记,crawl_label, 爬取成功为1,失败为0,使所有任务都写入Hbase。 - [REDIS]
增加任务放入任务队列同时写入Redis功能,实现对任务的跟踪管理。Key是taskid,value包括fail_times(0),email,task_status(pending。Fail_times达到上限,任务不再放入任务队列。若任务成功,状态标记为finished。
Redis任务队列、结果队列定义为全局变量,因为需要定时刷新配置重连Redis,不适合作为类属性传入Task Fetcher和Task Sender。
增加统计功能,统计总任务数,成功任务数,爬虫失败,Hbase失败,存在,不存在。可清零统计,导出丢失任务,在redis中一直标记为pending的任务。
减少Redis连接次数,封装Redis连接,Redis队列,Redis任务管理3个类。