Go 系列文章4 : 调度器

推荐用 stackedit 导出后看,文章中有不少 mermaid 图表,ghost 博客不支持展示。原始的 markdown 保存在:这里 写得稍微有点乱,主要是按自己看代码的顺序来记录的,也不是出书,就这样吧。 PS: 新人不推荐刚学 Golang 就去看调度器代码,这部分代码个人觉得写得很乱。 调度 基本数据结构 goroutine 在 runtime 中的数据结构: // stack 描述的是 Go 的执行栈,下界和上界分别为 [lo,

  • Cao ChunHui
45 min read

2018 年的几个目标

18 年已经到 6 月份了,定目标可能有点太晚了,不过有总比没有强,作为一个硕士毕业已经工作四年的程序员,切实地感觉到了时间的重要性,需要按照规划来用,不能像年轻人那样挥霍了。 完成 Golang 的大部分源代码阅读,并完成 golang-notes 完成 redis 3.0 的源代码阅读并有总结产出 完成 nginx 的源代码阅读并有总结产出,这个坑遗留得有点久,14 年刚毕业的时候就挖了,汗 完成 nats 源码阅读并有总结产出 完成 Go 高级编程中

  • Cao ChunHui
1 min read

blog 升级了。。

最近在写 golang-notes 的时候,看到 hexo 的 blog 支持直接展示 plantuml 和 mermaid 图表,折腾了一晚上发现并不是很好用。。。这些功能都是以插件形式支持,但在每个 blog 主题下又都需要自己配置,主题显然也没有什么统一的规范,自己用的话还是会碰到蛋疼的问题。此外 hexo 也不支持直接把图片上传到自己的 blog (别跟我说传什么七牛 cdn 之类的,几年后要是人挂了,你这就蛋疼了)。 虽然 ghost 已经商业化,且官网直接把 download

  • Cao ChunHui
1 min read

事故驱动开发

软件工程发展了这么多年,直到现如今,业界还是比较喜欢讨论 TDD,BDD,DDD。 虽然最后那个和前两个不太像是同一个维度的东西,不过因为都是 xDD,我们就先放在一起了嗯。每一种理论都有不少拥趸和践行者,都希望在各自的不归路上一路走到黑。至于每一种理论是否能为大众所接受,那就不好说了。犹记得某届 gopherchina,七牛的 CEO 去讲 http 测试,然后被人喷讲的太渣,没有深度,可能这位同学的潜台词是:我们想要的是画满了框图的架构 ppt,就是想看各种方块啊线条啊什么的,你却给我们来讲怎么写 test 和这些看起来 low 的不行的 test。

  • Cao ChunHui
9 min read

goroutine 的状态切换

在 runtime2.go(go 1.10) 中定义了 goroutine 生命周期中所有可能的状态,虽然状态不多,不过其状态切换的可能性还是蛮多的,整理了一张图: 带上 GC 以后,图会比较乱,去掉 GC 相关的状态切换以后,会清爽许多。这里所有的 goroutine 状态切换都是由 runtime 的函数触发的,我们把 runtime 字样也从图上删除: 抽时间写写状态切换的文章。 再来一张 p 状态切换的:

  • Cao ChunHui
1 min read

分布式系统中的不可靠复制问题

在《Designing Data-Intensive Application》一书中为当今大多数的互联网系统下了个定义,即数据密集型系统。在数据密集型系统中我们要应对的是数据的爆炸性增长问题。 为了应对问题我们采用了一些手段,比如 partition、replication,但这些手段,在一些场景或语言受限的情况下会带来一些麻烦的问题。本文主要讲一讲复制方面的问题。 说到复制 replication,可能大多数人第一印象都是存储系统中的复制,比如 MySQL 中基于 binlog 的复制,redis 中基于操作日志的复制,zk/etcd/kafka 中基于特定算法的复制(实质上也是基于 log 的复制),等等。但复制的概念本身实际上是很广的,

  • Cao ChunHui
12 min read

Go 系列文章3 :plan9 汇编入门

plan9 assembly 完全解析 众所周知,Go 使用了 Unix 老古董(误 们发明的 plan9 汇编。就算你对 x86 汇编有所了解,在 plan9 里还是有些许区别。说不定你在看代码的时候,偶然发现代码里的 SP 看起来是 SP,但它实际上不是 SP 的时候就抓狂了哈哈哈。 本文将对 plan9 汇编进行全面的介绍,同时解答你在接触 plan9 汇编时可能遇到的大部分问题。 本文所使用的平台是

  • Cao ChunHui
18 min read

[译]Go 和 interface 探究

这篇和之前的汇编那篇一样,都是翻译自 github 的 go-internals 这个项目,我的翻译地址是: https://github.com/cch123/go-internals 这篇写的比较长,如果讲深度的话。。那自己真是惭愧到不好意思去写 interface 的文章了。 不过还是要写,因为看这种基于汇编分析问题的东西,对于大多数人来说还是比较难。这篇其实也不能算面面俱到,而且作者的研究方法是从 binary asm 反推实现原理,实际上还可以直接去看编译器的代码的。 废话不多说,如下。 $ go version go version go1.

  • Cao ChunHui
80 min read

Go 系列文章1:Channel 从使用到源码分析

说明,做 Go 开发也有不短的时间了,积累了不少工具,感觉是时候开这么个坑了。源码阅读这种事情,别人发文、出书是别人的事情,如果没有自己尝试做一遍始终还是会少得到很多东西。最近感觉时机成熟,因为自己没有之前那么菜了,所以开这个坑。慢慢填上。内容是读 1.10 的源代码。用 stackedit 写完以后同步到 github 上,这里是原始仓库:golang-notes。 更新主要还是在 github 吧,主要是一些流程图性质的东西,这个挫逼博客不能支持啊,汗。 Channel go

  • Cao ChunHui
13 min read

协作/非协作式抢占

Go 最近有一个比较有意思的 proposal,提出要将协作式的抢占调度修改为非协作式的抢占调度,并使 Go 的每一条指令理论上都可以被抢占。起因是因为之前有类似这样的问题。当然,社区里遇到问题的人很多,如果你感兴趣,还可以看看这些 github 上的 issue:#543, #12553, #13546, #14561, #15442, #17174, #20793, #21053。 之前的协作式抢占是怎么一回事呢,我翻译的这篇 里其实已经有提及,该文中提到的函数中的 prologue 和 epilogue 即是可以执行调度的一个典型时机(但不是全部,此外还包括有

  • Cao ChunHui
2 min read

[译]go 和 plan9 汇编

本文翻译自: https://github.com/teh-cmc/go-internals 的第一章。之后如果有余裕,这个项目会一直跟进翻译。 . --> Chapter I: Go 汇编入门 在深入学习 runtime 和标准库的实现之前,我们需要先对 Go 的汇编有一定的熟练度。这份快速指南希望能够加速你的学习进程。 本章假设你已经对某一种汇编器的基础知识有所了解 涉及到架构相关的情况时,请假设我们是运行在 linux/amd64 平台上 学习过程中编译器优化会打开。 Table of Contents "Pseudo-assembly&

  • Cao ChunHui
18 min read

如何在 kv 系统中支持简单的 SQL

现在部门内进行数据收敛,特征相关的指标会逐渐收敛到 XFS 系统中。目前已经建设有 OFS(order feature system)、PFS(passenger feature system)。年后会建设 DFS(driver feature system)。 这些系统有共同的特征,根据 XID + 几个额外的参数来进行特征查询。而特征的具体存储可能是在 Rockstable(未来也可能是在 fusion),或者是在 MySQL,还可以来源于其它跨部门第三方系统的 API。 之前 XFS 对外主要提供

  • Cao ChunHui
3 min read

使用 debugger 学习 golang

常见的工程语言可分为解释型和编译型两种,比如写 php 的,一般就不怎么在乎 debugger 之类的东西。为什么?~~如果真出了问题,我可以临时把出问题的服务机器从线上服务中摘除出来,甚至申请一个较高的权限去修改代码,然后到处去 die/echo。虽然有人说这么做不太好,或者一般公司也不给开权限。不过着急的时候,这个肯定是可行的。~~然而像 java/go 这种编译型的就比较麻烦了。线上一般只有程序的运行环境而没有编译环境。就算是在线下,每次去加一行 fmt.Println 或者 System.out.println 都去编译一遍代码也是会明显降低幸福感的事情(当然这里有人说现在

  • Cao ChunHui
15 min read

开源书

最近在和 chai 大一起写开源书 advanced go programming book。实际上这个项目 16 年就开始了(汗。。最开始放在闭源仓库里,热情高涨的时候写两句。不过 private 的东西,总感觉像 dev/null 一样,和在只有自己能看到的小本本上写日记差不多,写久了以后会感觉有点没劲。 写书是一个很好的过程,系统化地总结学习过的知识,锻炼毅力和语言表达能力。不管哪种职业,语言表达能力和梳理能力都是必备的。顺便还能达到某些不可告人的目的(233。 具体可以参见这里: https://github.com/

  • Cao ChunHui
1 min read

clean architecture(下)

接上篇 模块 最早的时候,程序员们为了重用代码,会直接把代码 #include 到自己的项目中来,然后把库代码和应用代码一起编译出一个可执行应用。这个时间点,library 是通过源代码分发的。但是那个时候外部存储设备非常慢,而内存则非常贵并且容量很有限。没有办法把所有代码都放在内存中进行编译,这样编译器就需要多次从外部存储设备中读取源代码,然后多次访问巨慢的外部存储。可以预见,库的代码越多,可能会导致程序的编译过程就越慢,为了缩短编译时间,程序员们想出了可以把库和 application 分开编译的法子: 只要把 library 加载到固定的内存位置,例如 2000,那么我们就可以直接使用编译好的 library 了。 不过这种做法很快遇到了问题,程序自己要使用的内存很快就超过了

  • Cao ChunHui
15 min read

clean architecture(上)

这半年来和同事陆陆续续有一些关于业务的代码、框架方面的争论,期间阅读过一篇陶师傅给的,推销 DCI 模式的文章/论文,认真地做了笔记。年底了,又有美团的人跳出来说互联网的业务也越来越复杂了,传统的糙快猛已经满足不了当下的需求,我们必须要认真考虑设计,而不是在学到了样子没学到根本的敏捷开发思想之上堆屎。看起来现在有不少人把矛头指向了曾经奉为圭臬的 OO 和 web 开发中最常见的 MVCL(S) 分层以及国人学了半瓶水的敏捷开发,并且各自提出了一些所谓的解决方案,比如 DCI 号称解决了 OO 驱动的开发模式下代码难以和需求所对应,而 DDD 也解决了项目上了规模以后,代码和业务描述脱节难以理解的问题。(这么看来两者解决的都是一样的问题。 虽然通过阅读,

  • Cao ChunHui
30 min read

ApsaraCache 源码 diff 分析

阿里最近开源了新项目,叫 ApsaraCache,号称对 redis 做了一些优化,但开源分步骤(明显是你们没开发完吧)逐渐放出。这也进一步体现了大公司技术栈的混乱,相信在阿里内部这种类 redis 的玩艺儿绝对也不少。不过不扯这个。在 ApsaraCache 开源一期的优化中,主要有两个功能点: 在 redis 4.0 的基础上增加了 memcached 协议的支持 对短连接的情况进行了优化 把 ApsaraCache 的代码 down 下来用 Beyond Compare

  • Cao ChunHui
3 min read

从求交集开始

最近想起来之前写的一个比较有意思的程序,简单说一说吧~ 某互联网黑产需求 之前在帮某“互联网黑产大佬”干苦力的时候有这么一个需求,如果读者玩过某个集换式卡牌手机游戏的话应该知道卡牌的概念。手游卡牌的黑产生意实际上是通过 http 接口去刷别人的初始卡牌组合(就是看脸抽卡)。在刷卡的过程中可能会刷出一些价值比较高的初始号从而拿来挂在什么地方赚钱,这个初始号里相当于预先就存在了一些稀有的卡片,而省去了非洲人百抽不出 SSR 的窘境。而用户的购买过程则是需要提供其心仪的卡片,在已有的卡组里查询符合自己搜索条件的对应卡片。 啊,那换成微博的共同关注? 看不懂上面这段没有关系,我们把这个场景稍微修改,最近微博因为小鲜肉的恋爱爆料挂得比较惨,我们以微博的一个场景来举例: 用户 A 关注了 N 个人,把这些被 A 关注的用户 id

  • Cao ChunHui
6 min read

十周年

时间还是像流水一样就这么流过去了。 十年前的九月十二日,我们站在北航的图书馆门前,怀着对未来的憧憬进入了离家几百或者几千公里以外的大学。远离亲人和家乡,踏上了陌生的土地和教室。环顾四周,再也没有熟悉的同学和旧友。惆怅么?惆怅。悲伤么?不好说。 浪漫的散漫的童年时代就在拿到录取通知书的时候划上句号了。可是下一段青春好像怎么都找不到可以落笔的开头。新的班级和新的同学,虽说这样的场面还是在两次升学过程中经历过,这一次在他乡多多少少让人百感交集。 把人送到宿舍,别过依依不舍的父母。新的生活就这么开始了。然后就是想着漫长的大学时代。那个时候北京的房价还没有到五位数,房租还是以百计。年轻人们在狭窄的宿舍里开朗地讨论着未来和梦想----哦,梦想这算东西说归说,听到同宿舍的同学们说自己对软件和互联网没什么兴趣,是被调剂过来的。还是有些许的失望,但在他乡,即使同僚不上进,那依然是你可以依靠的为数不多的同僚。 紧跟着便是悠长的大学时代,哦,

  • Cao ChunHui
7 min read

如何定位 golang 进程 hang 死的 bug

之前在 golang 群里有人问过为什么程序会莫名其妙的 hang 死然后不再响应任何请求。单核 cpu 打满。 这个特征和我们公司的某个系统曾经遇到的情况很相似,内部经过了很长时间的定位分析总结,期间还各种阅读 golang 的 runtime 和 gc 代码,最终才定位到是业务里出现了类型下面这样的代码: package main import "time" func main() { var ch = make(chan int, 100) go

  • Cao ChunHui
4 min read