曹大带我学 Go(8)—— 一个 metrics 打点引发的事故

最近线上事故频发,搞得焦头烂额,但是能用上跟曹大学的知识并定位出了问题,还是值得高兴一把的。毕竟“打破砂锅问到底”,“定位出根因”一直是技术人的优良品质。 虽然我们总是逃不过事故驱动开发的魔咒,但吃一堑长一智,看别人的事故,学到的是自己的能力。 现象 一个平凡的午高峰,服务在全量上线的过程中,碰到一个非常重要的下游接口超时(后来发现该下游也在上线,可用实例数变少,正常实例负载变高,超时了一丢丢), …...

阅读全文

曹大带我学 Go(7)—— 如何优雅地指定配置项

最近一个年久失修的库导致了线上事故,不得不去做一些改进。 这个陈年库的作用是调用第三方的 RPC 拿一些比较重要的配置,业务代码中有段逻辑会根据读到的配置调用不同端的下游。如果没拿到配置,就会默认地调一个兜底下游。恰好这个兜底下游最近新上了一些逻辑,不兼容这种跨端调用,直接把它打挂了。 先抛开这个下游不健壮不谈,假设它是健壮的。 陈年库的问题在于:进程启动时它会去调一个下游拿数据,之后会定时更新。 …...

阅读全文

曹大带我学 Go(6)—— 技术之外

这篇文章主要来讲一下怎么做动画。 其实只要掌握几个核心的要点,就可以学会怎么用 Figma 做动画了。 我们想一下小时候看的那种胶片电影: 每一张胶片上的影像都是静止的,但是当胶片连续滚动时,静止的图片就变成了连续的视频。 或者想像一下小时候我们看的那种武打的小人书,连着翻页,就能看到一个连续的打斗场景,非常神奇! 用 Figma 做动画呢,也是类似的原理。 我们可以创建一组画布,在不同的画布之 …...

阅读全文

曹大带我学 Go(5)—— 哪来里的 goexit?

有同学在用 dlv 调试时看到了令人不解的 goexit:goexit 函数是啥,为啥 go fun(){}() 的上层是它?看着像是一个“退出”函数,为什么会出现在最上层? 其实如果看过 pprof 的火焰图,也会经常看到 goexit 这个函数。 我们来个例子重现一下: 1package main 2 3import "time" 4 5func main() { 6 go …...

阅读全文

曹大带我学 Go(4)—— 初始 ast 的威力

抽象语法树是编译过程中的一个中间产物,一般简单了解一下就行了。但我们可以把 Go 语言的整个 parser 和 ast 包直接拿来用,在一些场景下有很大的威力。 什么是 ast 呢,我从维基百科上摘录了一段: 在计算机科学中,抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构, …...

阅读全文

曹大带我学 Go(3)—— 如何用汇编打同事的脸

今天介绍几个常用的查看 Go 汇编代码、调试 Go 程序的命令和工具,既可以在平时和同事、网友抬杠时使用,还能在关键时刻打他们的脸。 比如,有同事说这段代码: 1package main 2 3type Student struct { 4 Class int 5} 6 7func main() { 8 var a = &Student{1} 9 println(a) 10} 的执行效率要 …...

阅读全文

曹大带我学 Go(2)—— 迷惑的 goroutine 执行顺序

上一篇文章我们讲了 Go 调度的本质是一个生产-消费流程。 生产端是正在运行的 goroutine 执行 go func(){}() 语句生产出 goroutine 并塞到三级队列中去。 消费端则是 Go 进程中的 m 在不断地执行调度循环,从三级队列中拿到 goroutine 来运行。 今天我们来通过 2 个实际的代码例子来看看 goroutine 的执行顺序是怎样的。 第一个例子 首先来看第一 …...

阅读全文

曹大带我学 Go(1)—— Go 调度的本质

首先抛出本文的结论:Go 调度的本质是一个生产-消费流程。 生产者-消费者模型 我们平时用 Go 最爽的一点莫过于用一句 go func(){}() 就启动了一个 goroutine 来并发地执行任务。这比用 C/C++ 启动一个线程并发地去执行任务方便太多。这句代码实际上就生产出了一个 goroutine,并进入可运行队列,等待 m 来找它从而可以得到运行。 熟悉 GMP 模型的朋友都知 …...

阅读全文

深度解密 Go 语言之基于信号的抢占式调度

不知道大家在实际工作中有没有遇到过老版本 Go 调度器的坑:死循环导致程序“死机”。我去年就遇到过,并且搞出了一起 P0 事故,还写了篇弱智的找 bug 文章。 识别事故的本质,并且用一个非常简单的示例展示出来,是功力的一种体现。那次事故的原因可以简化成如下的 demo: 我来简单解释一下上面这个程序。在主 goroutine 里,先用 GoMAXPROCS 函数拿到 CPU …...

阅读全文

深度阅读之《Mastering Go》

写在前面:这本书前前后后花了挺长时间,去年 11 月份就开始读了,中间又断了,直到最近才捡起来看完。 本书讲得内容非常全面,语言也很顺畅,生词非常少,并且内容没有太大难度,看起来比较过瘾,算是全面复习一下 Go 语言。如果你想开始练习阅读英文书,这本将是一个非常好的开始。 下面是阅读过程中记录的一些有用的点,随意看看就好。 Go 有很多优点,其中一点是没有预编译阶段,这使得它的编译速度更快。像 C …...

阅读全文