文档介绍:自制分布式爬虫系统北京数人科技有限公司 - 单机的 All-In-One 爬虫架构控制模块抓取模块抽取模块 HA Proxy 各地代理 URL HTML 模板结果 JSON XML 递归 URL 有状态解析 JS、地区代理、调速登陆利用 JavaEE 容器的线程池、共享状态分布式和微服务是 Silver Bullet 么? ?分布式和微服务的优点?特定模块单独开发和测试( …) ?容易对特定模块进行横向扩展( YES ) ?整体可靠性更高(?) ?服务(以及代码)可以重用( YES ) ?离线和在线类型服务可以混合部署( Great ) 做最坏的打算,祈祷最好的结果?上云的 Check List ①服务单元功能越单一越好②计算模块要做到无状态( 不依赖本地 I /O ) ③任何服务都不能有单点,必须做集群④可能的话,模块间接口尽量异步⑤分布式的配置管理, Rolling Update/Restart ⑥各个层面的集中式监控和日志方案⑦设计时做最坏打算——每个模块都可能失效, 而且无法及时报警⑧…… Step ,建集群控制服务抓取服务抽取服务结果聚合服务 HA Proxy 获取结果控制服务抓取服务抽取服务结果聚合服务最终结果中间结果?尽量利用 Docker 本身多实例,避免复杂的多线程编程?因为任务并行运行,所以需要保存中间结果,最后进行归并 Step HA Proxy获取结果控制服务抓取服务抽取服务结果聚合服务 URL Cookie HTML RabbitMQ :异步、服务发现、中间结果存储 JSON Step 、无状态、无状态控制服务抓取服务抽取服务结果聚合服务 HA Proxy 获取结果控制服务抓取服务抽取服务结果聚合服务 URL Cookie SessionID HTML SessionID JSON SessionID Pages ( JSON ) SessionID SessionID SessionID 问题: Reddis Cluster SessionID Step 4 集群化—服务发现、负载均衡? HTTP 接口? ZooKeeper / etcd ?使用 Marathon + Bamboo + HAProxy 进行服务发现? RabbitMQ 接口?通过监听 MQ 实现服务发现? MongoDB 如果不考虑自动扩展,使用既有的集群方案? Reddis 可以采用 Codis 方案 Step 5 离线和在线服务混合部署?离线服务吞吐很高,爬取模块队列经常破百万?在线服务要求实时性- MQ 集群化-队列设置优先级 http :// /federated-