周六日两天参加了Gopher China 2016大会,这次是第二届,去年一次是在上海,我是第一次参加。

大会分享的topic和嘉宾表现说实话远超我的预期,这里要感谢谢大和土豪赞助商。

下面从我关注的几个方面来说下:

业内应用

这两年Golang在互联网企业被很多开发者选用,从参会人员来看,绝大部分都是互联网业内开发者,用Go的还确实有点多。

这次国内gopher分享涉及多个方向,周知的有云计算/虚拟化(依然是docker)、分布式文件系统/数据库(BFS/TiDB)、大规模网络调度/中间层(CDN/Proxy…)。分享嘉宾也来自不同规模的互联网公司,可以说Golang在多个领域的实践是经得起考验的。同时, 今年还多了AI和MOBILE领域应用的分享。

AI方向的分享确实有点标题党,不过分享者陈辉本人的wukong、zerg项目很有学习价值,跟风关注了一波。

移动端这次讲了将Go代码应用到跨平台SDK开发中的实践,心动网络的演示是将Go代码以静态链接库形式编译到android、ios以及桌面端,虽然这里面仍有诸如runtime性能,扩展性等方面的问题点值得商榷,不过确实对Go在其他领域拓展提供了一种参考,不妨一试。

个人比较关注数据库,着重说下TiDB:

分布式数据库是这两年的热点,在水平扩展的同时去支持分布式事务;已有架构随着业务增长不得不拆库拆表,首先业务之后必须避免对多节点事务、子查询、join等操作的使用,同时接入层要具备强有力的proxy支撑,以平滑应对DB横向扩展以及业务路由。即使如此,大表DDL、DB集群扩缩容、多租户实现对DBA来说仍是不小的难点,运维负担不轻。

TiDB受Google F1&Spanner论文启发(paper:这里),算是原生实现吧,期望提供水平伸缩,异步/在线schema变更,分布式事务等功能,并兼容MySQL 协议,PPT里面的一张全景图:

Ti全景图

值得一提的是上图的TiKV是一个分布式的KV存储,用rust编写(赞下开放的rust社区);

下面是TiDB的结构:

TiDB

TiDB这部分相当于对F1的实现,使用Golang的有下面几个模块,简单来说:

  • SQL Layer:SQL解析、optimizer(执行计划)以及相关MPP framework的实现,MPP举了个条件下推的优化案例,即分布式查询中把查询条件下推到数据节点进行计算相比集中到layer上进行聚合结果集会获得更高的性能;
  • MySQL protocal server:对外提供完全一致的MySQL协议支持,应用无需要修改代码;它还要维护session状态以及高效的管理大量并发连接等,有点类似单机MySQL proxy中的部分功能
  • Placement Driver(PD):这个模块很重要,它用来完成对数据分布信息的存储,并控制全局的数据分裂、合并以及rebalance操作;PPT中有流程图说明
  • Control panel:图形界面,用了谢大的beego~

本人对分布式数据库了解较少,最近刚刚开始学习,分库sharding方案,公司团队去年也做了不错的尝试。不过还是很看好TiDB的发展,希望今年能做出好成绩。

性能与调优

Go 1.5是相对重要的版本,这个版本的GC延迟明显降低,这几乎对所有Go程序性能都有一定程度的提高。

这次会议涉及Go程序性能测试、分析、调试均有分享,pprof不能更好用。

Dave Cheney在调优环节的分享深入浅出,从Go语言层面讲了性能优化的建议,值得回去对着PPT实验下。

总体感受

  • Golang社区氛围很活跃,open source居多,第一天的分享以github公开项目为主,后续PPT和会场录像也会全部公开,方便进行二次学习。
  • 很多分享嘉宾都有代码演示环节,pprof“出镜率”最高;超大屏幕show code着实体现了一把工程师的逼格。
  • 谢大作为发起者,包揽了主持、翻译、控场多个身份,在会议时间、人员互动、广告以及展位这些地方很用心,分享和互动都处理的不错。比某数据库大会的气氛不知道好到哪里去了……
  • 遗憾的是16号晚上有事没能参加线下party,要是明年能去一定去混个脸熟

说起来自己接触Go也近两年时间了,线上也用Go开发的一些模块,不过不能和大会的分享相提并论……

个人没有语言偏见,但对比参会的开发者还是感觉这段时间技术积淀很少。总结的话应该多实践,这方面今年要多尝试,近期也想到了几个idea,之后会用Go尽快把它实现出来。