Go分布式爬虫笔记(五)_golang分布式爬虫架构

image

系统级别

系统级别优化与架构设计:

  • 如何对服务进行拆分
  • 如何将服务链接在一起
  • 服务调用的关系以及调用频率

各种问题:

  • 如何让服务随着负载的增加具有可扩展性?
  • 是否采用 DDD 的架构设计?
  • 如何进行分布式的协调?
  • 选择何种中间件、缓存数据库与存储数据库?
  • 使用何种通信方式?
  • 如何设计缓存与数据库的关系,才能避免缓存失效之后大量数据直接打到数据库导致的服务响应变慢甚至服务雪崩的问题呢?
  • 分布式系统中数据的一致性,如果业务能够接受读取到的数据不是最新写入的数据,那么就一定能设计出比强一致性读取响应延迟更低的系统。

服务治理:

  • 监控、告警
  • 降级策略(限流、重试、降级、熔断)
  • 分布式追踪与分布式日志收集

程序设计和组织级别

程序设计

  • 功能的拆分
  • 流程的抽象
  • 使用何种形式组织代码
  • 定义清晰的模块间的接口边界
  • 使用何种框架
  • 并发处理模型
  • 搭建的开发流程和规范
  • 重点指标体系的设计和监控

高性能程序设计的几个原则:

  • 流程异步化
    为了外部用户的体验,降低延迟,有时我们可以结合业务对流程进行异步化,快速返回结果给外部用户。这可以提高用户体验、服务的 QPS 与吞吐量。
    例如,任务执行完毕后需要将一些数据存入缓存中。这时可以直接返回结果,并异步地写入数据库。又如,调用一个执行周期很长的函数,可以先直接返回,然后在执行完毕后请求用户给的回调地址。不过要注意的是,无论怎样异步化,终究是需要执行任务的。
  • 在执行的关键阶段请求并行化,尽可能把串行改为并行。
    你可能听说过华罗庚烧水泡茶的故事,这个故事的要点,就是将整个大任务分割为小任务,让关键任务并行进行处理,这个方案可以大大减少整个任务的处理时间。
  • 合理选择与实际系统匹配的并发模型
    根据自身服务的不同,需要了解 Go 语言在网络 I/O、磁盘 I/O,CPU 密集型系统在程序处理过程中的不同处理模型。并根据不同的场景选择不同的高并发模型。
  • 无锁化与缓存化,保证并发的威力。
    试想一个极端的不合理的锁设计,它可能会让所有的用户协程等待某一个协程执行完成,导致并行处理退化为串行执行。无锁化并不是完全不加锁,而是要合理设计并发控制。
    例如设计无锁的结构,在多读少写场景用读锁替代写锁,用局部缓存来减少对于全局结构的访问(关于如何设计无锁化结构,你可以参考 sync.pool 库、go 内存分配、go 调度器等模块在并行处理中的极致优化)。

怎么用工具和指标来验证程序实际并行的效率呢?

  • 协程数量
  • 调度器的运行方式

获取协程数量的方式:

  • 借助 Debug 库中的 NumGoroutine 函数,GOMAXPROCS 还可以获取逻辑处理器 P;
  • 使用 runtime/metrics 包,获取运行时 metric,进而获取到协程数量;
  • 通过 pprof 获取当前的协程数量。

调度器:Go调度跟踪

  • 启动 GODEBUG 特定环境变量方式,查看调度器日志;
  • 通过 pprof 和 trace 工具,可视化分析调度器的运行状态。

代码实施级别

  • 合理代码优化

    • 代码规范

    • 数据结构与算法

      • 算法优化
      • 数据结构优化
    • 缓存:空间换时间

      • CPU多级缓存
      • Go运行时调度器
      • Go内存分配器
      • sync.pool
    • 复杂度

    • benchmark对比

  • 刻意的优化

    • 放入接口中的数据会进行内存逃逸,需不需要优化?

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
79mkD-1726037820859)]
[外链图片转存中…(img-6svtDpX6-1726037820860)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值