Go分布式爬虫笔记(八)
创始人
2025-05-30 23:21:23

08_项目需求分析与架构设计

需求分析

  • 业务需求

    • 爬虫引擎为基础的推送系统

    • 提供

      • 快速的热点事件
      • 事件预警
  • 用户需求

    • 快速了解自己感兴趣的最新新闻
    • 事件预警机制
    • 帮助快速决策
  • 功能需求

    • 用户填写或选择自己感兴趣的话题、感兴趣的网站还有消息接受频率
    • 用户接收最新热点事件的推送
    • 用户通过点击获取与该事件关联的事件,并得到相关的事件预测、预警,甚至可能在网站中进行快速的交易
    • 用户可以查看历史记录,可视化呈现某一个事件的来龙去脉,并进行复盘
  • 产品需求

    • 前端页面设计

    • 用户交互设计

    • 后端爬虫引擎设计

      • 爬取数据
      • 数据收集
      • 数据清洗
      • 数据存储
    • 数据分析设计

    • 数据推送设计

功能性模块分析

  • 数据输入

    • 种子网站: 提前规划好的新闻网站与论坛。
    • 用户通过界面和 API 接口动态增加或修改的任务。
  • 任务配置和管理

    • 读取配置文件中预先制定的任务列表
    • 存储后面用户动态新增的任务
    • 接口: 任务增删改查
    • 接口; 获取任务状态
  • 任务

    • 任务要爬取的 URL

    • 任务相关规则的描述

      • 抓取页面中的哪一些信息
      • 哪一些网址需要进行爬取
      • 页面爬取的深度
      • 请求超时时间
    • 规则引擎模块处理规则: 任务相关的规则可能比较复杂并且有关联,例如 A 网站爬取到 B 网站,B 网站爬取到 C 网站,每一个网站都需要有对应的处理规则。

  • 调度引擎

    • 任务均衡分发到采集模块
    • 接受任务存储到队列中
  • 采集引擎

    • 采集工作: 解析相应的页面信息.

    • 访问方式

      • 直接访问
      • 模拟浏览器访问
      • 提前登录
    • 采集算法

      • 深度优先搜索
      • 广度优先搜索
    • 任务回流调度引擎

  • 辅助任务管理模块

    • 限流器: 控制任务的采集频率
    • 代理器; 隐藏源IP, 突破服务器反扒机制
    • 去重器: 避免重复任务
    • 随机UA: 生成随机User-Agent
    • 任务优先级队列: 任务分级, 高优先级先执行
    • 失败处理器: 处理采集失败后的重试问题
  • 数据清洗和存储

    • 缓存队列: 收集一批数据后批量将数据写入数据库中.

    • 存储引擎

      • 存储到不同类型的数据库或文件中

​[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P88iGxhi-1679233104210)(https://assets.b3logfile.com/siyuan/1658627274984/assets/image-20230319210644-zuyxt7f.png)]​

非功能性模块设计

  • 扩展性

    • 服务能够随着任务数量的增加而扩展, 能够快速增加 Worker 程序的数量
    • Worker 服务是无状态的
    • 任务可以在任何 Worker 中运行,并且具有相同的行为。
  • 我们的任务将会在 Worker 中长时间存在,因此,我们会遇到许多新的问题:

    • 当我们增加一个新的 Worker,该怎么保证任务可以重新分配,或者确保新的任务一定能分配到新的 Worker 呢?
    • 每一个任务的负载是不同的,例如一些任务会比另一些任务消耗更多的 CPU 与内存。那么我们要如何合理分配任务,才能让每一个 Worker 负载均衡呢?
    • 解决: Master-Worker架构
  • 服务可用性 分布式系统容错问题

    • Master

      • 主要任务是完成调度工作,本身不需要实现多高的并发量,任务的调度和分配在一个程序中就能搞定。
      • 为了解决故障容错问题,我们需要有多个 Master 随时待命,这会需要对多个 Master 进行选主,客户端只能与 Master 的 Leader 节点进行交互,并且只有 Master 的 Leader 节点能够调度任务到 Worker。
    • Worker

      • 当 Worker 崩溃后,运行在其中的任务将无法运行。
      • Master 能够监控到 Worker 的数据变化,并且 Master 能够通过任务的重新分配将崩溃节点的任务分散到其他 Worker 中。
      • 当 Worker 重新恢复后也有类似的过程。不过由于 Worker 无状态,不用考虑 Worker 崩溃之后数据的不一致问题。
  • 分布式系统协调组件 etcd

    • 监听Worker节点
    • 服务发现
    • 任务动态分配
    • Master节点选主工作

​[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nasbhVOB-1679233104210)(https://assets.b3logfile.com/siyuan/1658627274984/assets/image-20230319211403-0guhuxa.png)]​

架构设计

  • Mater

    • 提供用户操作接口

      • 任务增删改查API
    • 任务调度器

      • 任务调度
      • 动态获取和监听Worker节点变化,实现任务动态的负载均衡
    • 借助etcd实现选主,实现可用性

    • 集群只有一个Leder,其他Master收到的请求会转发到Leader中处理

  • etcd

    • 为Worker与Master实现注册中心功能
    • 实现事件的监听和通知机制
    • 存储每个Worker需要执行的任务,由Master分配
    • 提供Master选主能力
  • Worker

    • 动态监听Worker分配的任务
    • 注册服务到etcd
    • 完成海量并发任务的爬取、解析、清洗、存储工作

​[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8jtxj71z-1679233104211)(https://assets.b3logfile.com/siyuan/1658627274984/assets/image-20230319211429-agja9xx.png)]​

实现细节

  • 框架与协议
  • 高并发模型
  • 程序扩展性设计

思考题

对 Go 这种静态编译的语言,你知道怎么在不重新编译和运行程序的情况下,动态添加一个新的爬虫任务和新的爬虫规则吗?

  1. 任务,通过用户界面添加到数据库里,然后任务调度器读取任务进行就好了。
  2. 规则,两种思路,如果可以将规则写成配置文件,如yaml,json之类的,那直接动态添加这个规则。但如果这个规则比较复杂,可以考虑为规则单独起一个服务,将服务配置到任务调度器里

「此文章为3月Day8学习笔记,内容来源于极客时间《Go分布式爬虫实战》,强烈推荐该课程!/推荐该课程」

相关内容

热门资讯

Mysql常用数据类型总结 整形 枚举类型ENUE整形       TINYINT,SMALLINT,MEDIUMINT,IN...
【flink sql】创建表 flink sql创建表语法 CREATE TABLE [IF NOT EXISTS] [catal...
python opencv 保... 👨‍💻个人简介: 深度学习图像领域工作者 dz...
Pytorch深度学习实战3-... 目录1 数据集Dataset2 数据加载DataLoader3 常用预处理方法4 模型处理5 实例&...
自定义类型的超详细讲解ᵎᵎ了解...   目录 1.结构体的声明 1.1基础知识 1.2结构体的声明 1.3结构体的特殊声明  1.4结构...
Docker等容器技术如何与移... 移动应用程序的开发面临着很多挑战,包括开发环境的设置、测试的困难、部署的复杂性等。由于...
【微服务】—— Nacos安装... 文章目录1. Windows安装1.1 下载安装包1.2 解压1.3 端口配置1.4 启动1.5 访...
【OpenGL】 为了理解这个函数我们需要先学习一些OpenGL的内容 OpenGL可视化 https://g...
hjr-详细说一下Redis集... Redis作用 缓存 一般我们用Redis做缓存,热点数据 击穿:访问到...
【蓝桥杯】 C++ 数字三角形... 文章目录题目描述输入描述输出描述实现代码解题思路注意点知识点 题目描述 上图给出了一个数字三角形。从...
VR全景展会丨探索未来,重塑现... 随着科技的不断发展,虚拟现实(VR)技术逐渐成为一个重要的...
C++数据类型 目录 C++基础数据类型 指针 指针类型 指针赋值 引用 参考:《深...
超实用!!! 三分钟将你的项目... 文章目录前言一、在项目中新增配置二、配置github page setting?三、如...
数据结构---队列 专栏:数据结构 个人主页:HaiFan. 专栏简介:这里是...
数字操作方法 系列文章目录 前端系列文章——传送门 JavaScript系列文章——传送门 文章目录系列文章目录...
Cartesi 2023 年 ... 查看 Cartesi Machine、Cartesi Rollups 和 Noether 的更新正在...
JavaWeb——jsp概述入... JSP定义:  在如下一个jsp文件里面有如下的代码  <%@ page content...
一切喜怒哀乐都来自于你的认知 01 有个学子,准备出国,父母请来清华的教授宁向东。请问教授࿱...
JAVA并发编程——synch... 引言         Java语言为了解决并发编程中存在的原子性、可见性和有序性问题,...
git学习----3.21 未... 文章目录前言Git :一个分布式版本控制工具目标一、概述1.1 开发中的实际场景1.2...
Qt优秀开源项目之十七:QtP... QtPromise是Promises/A+规范的Qt/C++实现。该规范的译...
【前端八股文】JavaScri... 文章目录Set概念与arr的比较属性和方法并集、交集、差集Map概念属性和方法String用索引值和...
海康硬盘录像机接入RTSP/o... EasyNVR安防视频云服务平台可支持设备通过RTSP/Onvif协议接入平台,能提供...
在混合劳动力时代如何避免网络安... 在混合劳动力时代如何避免安全网络风险 三年多来,混合工作一直是工作生活中不可或缺的一...
2023还不懂Jmeter接口... 这里介绍的Jmeter接口测试的的实战,如果文章内容没遇看懂的话,我这边...
基于4G/5G弱网聚合的多链路... 基于4G/5G多卡聚合(弱网聚合)的智能融合通信设备技术亮点 增强带宽提供可靠连接 通过将多个有线和...
如何使用Synplify综合v... 文章目录使用Synplify综合的好处synplify的教程方法1(无效)...
2023年全国最新高校辅导员精... 百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等ÿ...
2022年18个值得期待的Le... 有数百个独特的LearnDash附加组件,您可能很难选择您的LearnDash LMS...
【java基础】Stream流... 文章目录基本介绍流的创建流的各种常见操作forEach方法filter方法map方法peek方法fl...