之前通过scala实现了多线程的爬虫去爬取某网站的音乐数据,但是为了体现分布式的高并发场景,一方面是可以提升更高的性能,另外一方面也是为了用到Akka的并发。前面提到过,分布式并发哪家厉害,JVM上去找Akka,毕竟,spark的分布式和高并发也是通过Akka实现的。Akka的基础结构主要是Actorsystem和actor组成。先画个脑图,看看整合Akka做分布式的基础结构:
需要解决的问题是:
选定Master节点,作为我们任务的管理节点,包括管理各个worker节点的存活情况等;
各个节点间的网络通信问题,比如:Master节点启动后,worker节点通过发送消息向Master先进行注册,Master节点在读取信息后,将成功的信息返回给worker节点,节点间的消息在网络中传输需要进行序列化;
worker节点得知注册成功消息后,将具体的任务下发,这里当然是开始进行爬取任务。
在Idea中建立了对应的单例和类,remotemessage中封装了所有进程间消息,Master中会定期检测worker状态,worker节点启动后将与master进行通信,然后下发爬取的任务。
实现的结果如下所示,Master节点启动时候监测worker节点没有消息发送过来。
当worker节点起来后,会通过网络发送注册的消息,这时候会发现有一个存活的worker节点,并将消息返回给worker,worker开始拉起爬取任务。数据量大的情况下,上分布式爬任务,效率也会提升很多。
领取专属 10元无门槛券
私享最新 技术干货