喜提 Go Contributor

上次写了一篇《喜提 Redir Contributor》,内容是给欧神写的一个短网址小工具加了一个输出结果排序的功能,凑了个热闹。结果有朋友看成了 redis contributor,并没有那么牛逼~😛 但这次真的是给 golang/go 提交了代码,喜提 Go Contributor。 当然因为是第一次,只是改了几个 typos,不过也算零的突破了~ 周末看 proc.go …...

阅读全文

Go 命令 『go build -X』 的妙用

不知道大家还记不记得,上次发了一篇关于 panic 检测机器人的文章,原理非常简单,简单回顾一下: 业务服务在 recover 函数里通过 HTTP 请求的方式向机器人上报 panic 栈信息。 机器人解析出 panic 栈里的代码行号,调用 gitlab 接口拿到该行代码的提交人、提交日期等信息。 当然,后面我又给机器人增加了一些其他的功能,例如自动拉群,自动提醒相关人修复 panic 代码 …...

阅读全文

Go channel 的妙用

昨天在内网上看到一篇讲数据库连接的文章,列出了一些 sql 包的一些源码,我注意到其中取用、归还连接的方式非常有意思——通过临时创建的 channel 来传递连接。 在 sql.DB 结构体里,使用 freeConn 字段来表示当前所有的连接,也就是一个连接池。 1type DB struct { 2 freeConn []*driverConn 3} 当需要拿连接的时候,从 freeConn 中 …...

阅读全文

事故现场之依赖了不该依赖的 host ip

昨天,组里服务遇到了一个诡异的问题,跟着看了下原因,记录在此。 先介绍背景:我们维护了两个服务,一个对外服务,承接流量,称之为主服务,主服务会调用各种第三方 RPC 服务,获取各种字段,拼在一个大的 model 上。其中有一个 RPC 服务,称之为 E 服务,是我们自己维护的,它返回一部分字段。 E 服务会定时读取规则平台上的规则数据,根据这些规则计算返回给主服务的数据。运营或产品在规则平台上配置 …...

阅读全文

写一个 panic blame 机器人

最近接手了一个“公共”服务,负责维护它的稳定性。代码库有很多人参与“维护”,其实就是各种业务方使劲往上堆逻辑。虽然入库前我会进行 CR,但多了之后,也看不过来,还有一些人自己偷摸就把代码合到 master 上去了。总之,代码质量无法得到很好的保证。 当然了,如果把合代码的权限收敛到我一个人,理论上是可行的。但是,一方面,业务迭代的速度很可能就 block 在我这了;另一方面,业务方的迭代逻辑涉及很 …...

阅读全文

喜提 redir contributor

看多了 Go 源代码,看一看应用,尤其是比较短小且有趣的应用代码,感觉很有意思,而且举重若轻。 如果顺带修一下小的错误,成为 Contributor,那就更多了一种成就感。就像杨文前几天成为 Go Contributor 那样,从小处开始,慢慢提升技术含量,总有一天,慢慢成为真正的 Contributor,像曹大那样。 某天欧神和杨文不知道怎么鼓捣出了一个 golang.design 网站,前一阵 …...

阅读全文

深度阅读之《Concurrency in Go》

作为一个终身学习者,输入和输出是必不可少的。输入多了之后,会发现很多中文文章很难读,可能还有很多错漏之处。不客气地说,输入的是垃圾,输出的只能是垃圾。 曹大经常说需要多看英文资料,包括各种新出的英文书、文章等等,这从他的书单也可以看出来。我自己的情况是:英文资料读的不多,英文技术书则基本就没完整地读过一本。之前在写文章的过程中,还是看了一些英文文章,收获很大。 这次尝试读一读英文技术书。但是直接读 …...

阅读全文

《Head First 设计模式》读书笔记

第一章 设计模式入门 使用模式最好的方式是:”把模式装进脑子里,然后在你的设计和已有的应用中,寻找何处可以使用它们。” 通过一个给 Duck 类型添加 fly 功能的实例,一步步地提出解决方案。 先是使用继承,但是继承并不能很好地解决问题,因为鸭子的行为在子类里不断地改变,并且让所有的子类都有这些行为是不恰当的。 接着又提出使用接口,但是 Java 接口不具有实现代码,所以继承接口无法达到代码的复 …...

阅读全文

深度解密 Go 语言之 sync.map

工作中,经常会碰到并发读写 map 而造成 panic 的情况,为什么在并发读写的时候,会 panic 呢?因为在并发读写的情况下,map 里的数据会被写乱,之后就是 Garbage in, garbage out,还不如直接 panic 了。 是什么 Go 语言原生 map 并不是线程安全的,对它进行并发读写操作的时候,需要加锁。而 sync.map 则是一种并发安全的 map,在 Go 1.9 …...

阅读全文

『���』引发的线上事故

最近遇到了一起依赖升级 + 异常数据引发的线上事故,教训惨痛,本文对此进行回故和总结。 背景 起因是我们使用的服务框架版本比较老,GC 次数的 metrics 打点一直为 0,咨询了相关同学后,决定升级框架。升级的过程中,出现了 use of internal package xxx not allowed 的报错,又咨询了一下相关同学后,尝试使用 go mod 解决。 从 go vendor …...

阅读全文