Go 进阶 · 分布式爬虫实战
郑建勋
Go 语言技术专家,《Go 语言底层原理剖析》作者
15839 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 58 讲
Go 进阶 · 分布式爬虫实战
15
15
1.0x
00:00/00:00
登录|注册

08|高性能设计:自顶向下的高性能Go程序设计与优化

你好,我是郑建勋。
用最少的资源将程序的性能优势最大化,这不仅是每一个有追求的开发者的目标,更是企业为了达到更好的用户体验(例如更小的响应时间)、更低的成本面临的现实困境。
性能问题无处不在,从设计、开发阶段如何避免性能问题,再到如何发现问题,发现问题后如何分析、排查、调优,“性能”二字贯穿于系统的整个生命周期。
但是应该怎样攻破性能问题呢?性能问题涉及到的知识面广而且深刻,如果没有方法论的支撑,要解决它们无异于大海捞针。接下来的两节课,我会带你构建起一种分层的分析范式,并通过它对问题进行分层抽象,抽丝剥茧,将问题逐个击破。

过早的优化是万恶之源?

说到这里,你可能迫不及待想要看看我的这个分层分析范式,验证一下它到底有多大本事。先别急,计算机科学中有句名言:过早的优化是万恶之源。
不过,这个“过早”指的是多早呢?很多人习惯用这句话为自己不考虑程序性能的行为开脱,他们又有没有道理呢?其实,读懂这句话的上下文,这些问题就迎刃而解了。
首先,不加思考,一上来就优化肯定是不对的,这是这句话隐含的第一层意思。开发者应该更多地关注程序中的关键部分,忽略掉不关键的部分。有些开发者过于追求完美,希望考虑到所有的细节。但是,最快的代码是从未运行过的代码。你几乎总是能够使程序变得更快,优化通常是一种收益递减的游戏。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何通过自顶向下的方法来设计和优化高性能的Go程序。作者指出,性能优化需要有具体的方法论支撑,才能将问题分离出来,有的放矢地解决性能问题。文章提出了将性能优化分为5个级别的分层抽象,从系统级别开始思考性能设计。在系统级别优化中,需要以架构师的视角构建“概念完整性”的系统,从全局角度思考程序的系统问题。文章还提到了系统级别优化与架构设计的紧密关系,以及在大型微服务集群中的性能优化所涉及的内容,如服务的治理、缓存与数据库的设计、分布式系统中数据一致性等。总的来说,本文为读者提供了一种分层的性能优化方法论,以及在系统级别进行性能设计的思考方向。 文章还介绍了程序设计和组织级别的复杂系统,以及如何通过程序设计来构建高性能、可维护的程序。作者提出了高性能程序设计的几个原则,包括流程异步化、执行关键阶段请求并行化、合理选择与实际系统匹配的并发模型,以及考虑无锁化与缓存化,保证并发的威力。此外,文章还介绍了如何用工具和指标来验证程序实际并行的效率,包括获取协程数量的方式和分析调度器运行状态的思路。 总的来说,本文提供了全面的性能优化方法论和实践指导,帮助读者从系统级别到程序设计和组织级别,全面了解和应用高性能程序设计的原则和技巧。文章内容丰富,涵盖了系统架构、程序设计、并发模型选择、无锁化与缓存化等方面,适合对Go语言性能优化感兴趣的读者阅读学习。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 进阶 · 分布式爬虫实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • 8.13.3.27.30
    第三是要合理选择与实际系统匹配的并发模型 如何合理选择? 我理解我选择了GO,它得并发模型就定了。还可以使用GO的其他并发模型吗

    作者回复: 要发挥Go的并发优势,并不是一件容易的事情。不会因为使用了Go就天然的有了高并发。 也需要设计的,Go并发中也有多种经典的并发模型,后面会介绍

    2022-11-10归属地:北京
    1
  • 8.13.3.27.30
    如何让服务随着负载的增加具有可扩展性?是否采用 DDD 的架构设计?如何进行分布式的协调?选择何种中间件、缓存数据库与存储数据库?使用何种通信方式? 能否具体描叙一下到底如何?

    作者回复: 在后面的项目实战中我们将会实战这些话题,这里只是给出了需要思考的东西

    2022-11-10归属地:北京
    1
  • czy
    第几章进入代码环节呀?

    作者回复: 下周Worker篇就会进入

    2022-10-30归属地:北京
    1
  • Realm
    1 下载器和解析器解耦分离,通过chan联系起来,各司其职,不够就增加worker; 2 从《linux性能优化》专栏学习到,影响系统性能的有: 第一种资源瓶颈,如CPU、内存、磁盘和文件系统 I/O、网络以及内核资源等各类软硬件资源出现了瓶颈,从而导致应用程序的运行受限。对于这种情况,我们就可以用前面系统资源瓶颈模块提到的各种方法来分析。 第二种依赖服务的瓶颈,也就是诸如数据库、分布式缓存、中间件等应用程序,直接或者间接调用的服务出现了性能问题,从而导致应用程序的响应变慢,或者错误率升高。这说白了就是跨应用的性能问题,使用全链路跟踪系统,就可以帮你快速定位这类问题的根源。 最后一种,应用程序自身的性能问题,包括了多线程处理不当、死锁、业务算法的复杂度过高等等,用火焰图辅助分析.
    2022-10-27归属地:浙江
    11
  • G55
    第一个问题。所有要爬取的网页连接可以看做是一个DAG图。 可以采用BFS遍历的方式来实现爬取。维护一个待爬取url的channel, 每次从一个网页上获取到下一级的url就加入到这个channel中。 同时, channel的另一侧读取channel, 待爬取url channel 不为空时就读取url并启动一个新的协程去爬取对应url 并解析返回内容。
    2022-10-27归属地:北京
    8
  • 牙小木
    从上一个网络模型到了性能这里,有点突兀,^_^
    2023-08-14归属地:北京
  • 文经
    这一讲有点抽象,后面遇到实际的例子再回头看看。
    2022-11-26归属地:广东
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部