我的2014

很少会写总结,我现在能记起的应该是2012年,那一年特别想写总结。因为那一年发生的事情实在太多,使我一直平淡的人生起了波澜。2014年是我的本命年,却似乎并没有期待的那样,会有什么特别的事情发生。过的平淡,但相比以往却又有很多不同。

这一年是我作为一个公司雇员,作为一个工作者完整的第一年。过完春节回到北京,便去参加做封闭开发,开发了一个多月,为米粉节做秒杀系统。其实当时还真的有点兴奋,觉得可以真切的去参与一个项目。一种临危受命的承当感。那段时间,真的是全身心去投入做一件事情,没有周末,没有白天黑夜。空下来就是写代码。以至于后来我翻开那个时候的代码都觉得写的挺好的。其实从来都是觉得自己以前写的代码很挫的,但是这次是例外。相对来说,能够亲身经历一场并发连接2000万,QPS过百万,总PV超百亿的活动,也算是一种幸运吧。那天活动结束之后,仿佛参加完一次高考,终于放下负担。对于秒杀峰值系统设计,网上的资料真的不多,不像大数据,前端技术之类的,有很多现成的分享。这样的秒杀系统只能根据自己业务场景去设计,说到这里想起自己大学的时候,有些妄想,总想设计出一种高性能的网站,能够用最少的资源抵抗住最大的压力。因此,当时小米来学校招实习生的时候,听他们介绍抢购网站的压力,还觉得很兴奋。其实也挺有幸可以实际参加到这样场景中。

这一年也是我大量使用Go语言开发的一年,或许应该说就是那Go语言开发项目了。虽然12年的时候便开始尝试用Go,但是实际将它用到项目中,还是13年开始,而这一年是我渐渐深入使用Go语言的一年。给我明显的一个提升的感受的是在优化秒杀系统的服务端代码的时候,当时使用的是Go1.2版本,在大量长连接的情况下,会导致服务器内存占用很高,并且即使连接已经释放,而内存却不会释放,因此内存会无限制增长。其实这就是被大多数人所诟病的Go的GC问题。在米粉节当天就是因为这个问题,服务器重启了好多次。不过还好重启对服务的影响并不是很大。为了解决Go的GC问题,我基本完整地阅读了http标准库的代码,开始阅读的时候还有有点不适应,坚持下来,当我读完之后,我发现自己在很多地方提升很多,包括对HTTP协议的理解,使用TCP网络编程的方法,还有http标准库的设计方法,为什么有的地方要使用接口,有的地方要使用自己定义的结构体。看似没有区别,实际上都是有设计的考量的。在使用http标准库的过程中,我就体会到了这一点,即保持简单,又具有很大的扩展性。看完http标准库之后,我也查到了问题的所在,http标准库会在每次接受请求的时候申请4kb读缓存,4kb写缓存大小,还有2kb的chunk writer,另外在Request的头解析里面还申请了2k大小的缓存,在处理一次HTTP请求的时候,一共申请了10kb以上的缓存片。在大量的并发下,这些缓存片没有被很好的回收,因此就造成了系统内存使用过高,后来,通过预分配内存池,减少缓存大小等方法,将内存使用降低了近一半。这次阅读标准库的经历让我获益匪浅。

由于整个秒杀系统是有多个人开发的系统,我只是一个普通程序员,也没有绝对控制权,并且提出的一些建议也没有被采纳。因此,我便有意淡出了秒杀系统的继续的开发,而是维护现有的组件,并且迁移到海外AWS机房等。继续开发我的日志系统,一个实时的日志收集系统。重写了Agent的实现,实现了管理平台,可以方便的在页面上添加和编辑要添加日志收集的机器和目录,重写日志解析层的代码,从原来的Python重构成使用Go开发,性能和效率提升了近10倍。原来8核CPU跑满都很吃力,现在单核都跑不满,反而瓶颈出现在了网卡上。期间还统一了日志的打印格式,制定了日志的标准格式,这样就方便后端解析程序的实现了。做完这些之后,一个实时的日志收集系统已经相对完善。由于自己当初选型的时候就使用了kafka作为日志的pipeline,因此,具有很强的扩展能力。可以接入实时分析系统,存储系统和检索系统。

在这个过程中,秒杀系统逐渐有了要加入验证码的需求,本着模块化的思想,验证码想要作为一个服务单独抽取出来,于是,我开始写通用验证码服务,期间调研了多种验证码的实现方式和验证方式。发现,虽然是小小的验证码服务,整个过程也似乎是很简单。但是里面却也有很多难点,既然是通用服务,那么接入就要足够简单,否则不会有人使用。另外还要实现要性能,本身要是分布式和可扩展的。验证方式有借助cookie的,也有显示获取token的。借助cookie相对简单些。当然无论如何服务端都要保存问题和答案,并且具有一定的失效时间,而且即使前面有多台机器,一次验证之后,不得重复验证,最后还要限制单个用户的访问频率。在实现的过程中,为了让自己更加有收获,我还顺便想要实现一个WEB API框架,验证码服务本身就使用这个框架。最后验证码服务实现了,框架也仅仅是实现了一小部分,没有实现完整。

最后还是优化日志分布式日志收集系统,想要做的更加健壮,并且方便管理,使用和维护。以上工作中,有一半使用是在做一些维护性的工作。开始可以让我学到不少东西,但是时间一长,自己也颇感浪费时间。但是毕竟是工作,也要自己去完成。

生活中基本没什么变化,夏天的时候和几个同事买了自行车,在北京骑行了很多次,尤其是妙峰山那次。骑了二十多公里的盘山公路,也是第一次骑山路骑那么远。然后,不知是因为什么原因,学会了打dota,这个我在大学都没玩过一盘的游戏。在我学了它之后,它真的占据了我挺多时间的。算是弥补大学的时候没有玩游戏的空白吧。在快年末的时候,回老家参加了表姐的婚礼,还是那么热闹,顿时发现父辈们都老了,而曾经的弟弟妹妹们都长大了,成了当时的我们。时间一晃而过,曾经觉得初中,高中,六年是多么漫长的时光,而现在,年复一年,却失去了知觉。几年是马年,我属马,爸妈都属马,我已经经历了一代人的成长,也会渐渐老去,这样想来,仿佛死亡离得越来越近,甚是恐惧。在我们忙碌的时候,默然回头,发现早已不是自己心中的模样。

心中如果存有愿望,真的应该让自己去实现,不要在不经意间,发现自己已经错过了,2015年也已经过去二十四分之一,并不是为了追逐时间,而是为了去做自己心中想要的事情。

Xiang Chao 07 January 2015
blog comments powered by Disqus
Fork me on GitHub