2021年5月12日
不知道大家在实际工作中有没有遇到过老版本 Go 调度器的坑:死循环导致程序“死机”。我去年就遇到过,并且搞出了一起 P0 事故,还写了篇弱智的找 bug 文章。
识别事故的本质,并且用一个非常简单的示例展示出来,是功力的一种体现。那次事故的原因可以简化成如下的 demo:
我来简单解释一下上面这个程序。在主 goroutine 里,先用 GoMAXPROCS 函数拿到 CPU …...
阅读全文
2021年4月19日
写在前面:这本书前前后后花了挺长时间,去年 11 月份就开始读了,中间又断了,直到最近才捡起来看完。
本书讲得内容非常全面,语言也很顺畅,生词非常少,并且内容没有太大难度,看起来比较过瘾,算是全面复习一下 Go 语言。如果你想开始练习阅读英文书,这本将是一个非常好的开始。
下面是阅读过程中记录的一些有用的点,随意看看就好。
Go 有很多优点,其中一点是没有预编译阶段,这使得它的编译速度更快。像 C …...
阅读全文
2021年3月30日
上次写了一篇《喜提 Redir Contributor》,内容是给欧神写的一个短网址小工具加了一个输出结果排序的功能,凑了个热闹。结果有朋友看成了 redis contributor,并没有那么牛逼~😛
但这次真的是给 golang/go 提交了代码,喜提 Go Contributor。
当然因为是第一次,只是改了几个 typos,不过也算零的突破了~
周末看 proc.go …...
阅读全文
2021年3月15日
不知道大家还记不记得,上次发了一篇关于 panic 检测机器人的文章,原理非常简单,简单回顾一下:
业务服务在 recover 函数里通过 HTTP 请求的方式向机器人上报 panic 栈信息。 机器人解析出 panic 栈里的代码行号,调用 gitlab 接口拿到该行代码的提交人、提交日期等信息。 当然,后面我又给机器人增加了一些其他的功能,例如自动拉群,自动提醒相关人修复 panic 代码 …...
阅读全文
2021年2月4日
昨天在内网上看到一篇讲数据库连接的文章,列出了一些 sql 包的一些源码,我注意到其中取用、归还连接的方式非常有意思——通过临时创建的 channel 来传递连接。
在 sql.DB 结构体里,使用 freeConn 字段来表示当前所有的连接,也就是一个连接池。
1type DB struct { 2 freeConn []*driverConn 3} 当需要拿连接的时候,从 freeConn 中 …...
阅读全文
2021年1月29日
昨天,组里服务遇到了一个诡异的问题,跟着看了下原因,记录在此。
先介绍背景:我们维护了两个服务,一个对外服务,承接流量,称之为主服务,主服务会调用各种第三方 RPC 服务,获取各种字段,拼在一个大的 model 上。其中有一个 RPC 服务,称之为 E 服务,是我们自己维护的,它返回一部分字段。
E 服务会定时读取规则平台上的规则数据,根据这些规则计算返回给主服务的数据。运营或产品在规则平台上配置 …...
阅读全文
2021年1月11日
最近接手了一个“公共”服务,负责维护它的稳定性。代码库有很多人参与“维护”,其实就是各种业务方使劲往上堆逻辑。虽然入库前我会进行 CR,但多了之后,也看不过来,还有一些人自己偷摸就把代码合到 master 上去了。总之,代码质量无法得到很好的保证。
当然了,如果把合代码的权限收敛到我一个人,理论上是可行的。但是,一方面,业务迭代的速度很可能就 block 在我这了;另一方面,业务方的迭代逻辑涉及很 …...
阅读全文
2020年11月16日
看多了 Go 源代码,看一看应用,尤其是比较短小且有趣的应用代码,感觉很有意思,而且举重若轻。
如果顺带修一下小的错误,成为 Contributor,那就更多了一种成就感。就像杨文前几天成为 Go Contributor 那样,从小处开始,慢慢提升技术含量,总有一天,慢慢成为真正的 Contributor,像曹大那样。
某天欧神和杨文不知道怎么鼓捣出了一个 golang.design 网站,前一阵 …...
阅读全文
2020年9月5日
作为一个终身学习者,输入和输出是必不可少的。输入多了之后,会发现很多中文文章很难读,可能还有很多错漏之处。不客气地说,输入的是垃圾,输出的只能是垃圾。
曹大经常说需要多看英文资料,包括各种新出的英文书、文章等等,这从他的书单也可以看出来。我自己的情况是:英文资料读的不多,英文技术书则基本就没完整地读过一本。之前在写文章的过程中,还是看了一些英文文章,收获很大。
这次尝试读一读英文技术书。但是直接读 …...
阅读全文
2020年5月10日
第一章 设计模式入门 使用模式最好的方式是:”把模式装进脑子里,然后在你的设计和已有的应用中,寻找何处可以使用它们。”
通过一个给 Duck 类型添加 fly 功能的实例,一步步地提出解决方案。
先是使用继承,但是继承并不能很好地解决问题,因为鸭子的行为在子类里不断地改变,并且让所有的子类都有这些行为是不恰当的。
接着又提出使用接口,但是 Java 接口不具有实现代码,所以继承接口无法达到代码的复 …...
阅读全文