【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。

  源代码

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线