【Golang实现网路爬虫】分布式爬虫系统构架
优采云 发布时间: 2020-05-03 08:01
分布式系统是一个硬件或软件组件分布在不同的网路计算机上,彼此之间仅仅通过消息传递进行通讯和协调的系统。简单来说就是一群独立计算机集合共同对外提供服务,但是对于系统的用户来说,就像是一台计算机在提供服务一样。分布式意味着可以采用更多的普通计算机(相对于高昂的大型机)组成分布式集群对外提供服务。计算机越多,CPU、内存、存储资源等也就越多,能够处理的并发访问量也就越大。
从分布式系统的概念中我们晓得,各个主机之间通讯和协调主要通过网路进行,所以分布式系统中的计算机在空间上几乎没有任何限制,这些计算机可能被置于不同的机柜上,也可能被布署在不同的机房中,还可能在不同的城市中,对于小型的网站甚至可能分布在不同的国家和地区。
不同的资料介绍起分布式系统的特性,虽然说法不同,但都大同小异,此处我们针对于要实现的分布式爬虫,总结为以下3个特征:
消息传递完成特定需求
消息传递的方式:
分布式系统的*敏*感*词*:
一般对外会使用REST,模块内部会使用RPC,效率会更高一些,模块之前:中间件、REST
针对于目前我们遇见的问题,我们给予解决方案分布式爬虫架构,来设计分布式爬虫项目的构架:
1.限流问题
问题:
单节点承受的流量是有限
解决:
将Worker放在不同的节点
2.去重问题
问题:
单节点承受的去重数据量有限
无法保存之前去重结果(因为是存入到显存(map))
解决:
基于Key-Value Stroe(如Redis)进行分布式去重
3.数据储存问题
问题:
存储部份的结构,技术栈和爬虫部份区别很大
进一步优化须要特殊的ElasticSearch技术背景
解决:
存储服务
所以最终我们的分布式爬虫构架如下:
还有一个关键点:从Channel进化到分布式
之前我们为了实现并发,使用了大量的goroutine以及Channel。那我们就可以开启一个远程的RPC服务分布式爬虫架构,然后进行同步的调用。
RPC有很多种做法,本文采用jsonrpc。
源代码