GopherChina第一天小结

GopherChina第一天小结

今天参加了Asta举办的第五届GopherChina,第一天参加完,很有感觉,晚上回来趁着还有记忆,来作一下记录。mysql

写在前面

一早从9点开始,一天下来一共八个主题,各个主题都有本身的特点,所有听下来也是挺不容易的。这些主题有大到说框架,也有小到说具体的某个包的使用的。golang

参会

一早上真心起的比上班还早,早早就过去占了个位子。以前也参加过一些技术大会,最担忧的就是讲师讲说的主题变成某个公司的宣传分享。咱们听众大都怀着学习的心态来的,都但愿能在技术大会上获得的是一些干货,所谓干货,就是经验。就是说并非你用Golang作了多牛逼的事情,而是你怎么用Golang作了多牛逼的事情,在作了多牛逼的事情的过程当中有哪些经验只谈,哪怕只有一个经验分享,能让咱们在实际工做中绕开这个坑,也或许就值回票价了。redis

大型微服务框架设计实践

这个是我司滴滴欢总的分享。其实以前我在内部已经听过一遍这个分享了,当时听完以后就对这个在咱们外卖部门践行下来的微服务框架的思想、实现都很是感兴趣。还强烈建议其余公司的小伙伴必定要仔细听欢总这个分享。今天第二次听,PPT已经较以前内部分享的润色很多,也作了一些公司业务的脱敏处理。不过总体听完,让我对业务框架的认识又深了一层。算法

整个PPT大体是从框架开始提及,从框架的进化史,说到框架的风格(从配置->约定->DSL->容器化),从而引入“操做系统”的概念,表述说如今的服务框架,正愈来愈向操做系统的方向发展。我如今还记得今天杜欢在大会上表达的一些对框架的言论,好比业务框架应该符合原则“Rule Of Lease Power”,即恰好够用。好的框架须要屏蔽业务无关的通用技术细节,让一些不可靠的调用变得可靠起来。这些言论真是不能赞成更多。框架和业务代码的关系就是一个封闭开放的原则,框架须要把不想对业务代码开放的部分给尽量封装掉,让业务的思惟负担彻底聚焦在具体的业务代码中。sql

参会

然后欢总就开始聊起了他亲手写的微服务框架的一些实现要点。这些要点虽然没有具体的代码展现,不过基本也把如何实现都说了一下。首先框架与业务正交,经过提供一系列工具链,能自动生成最初的项目模版,并经过代码注入一些框架须要的代码。这个是说的对于框架,完善的工具链是能减轻不少业务的负担的。其次,他的框架将全部底层实现都进行了封装,包括对mysql,redis,kafka等的封装。其中还特地说了他的redis封装,基本就是按照redis的command 文档进行了一轮封装。还有,他提到的对http和rpc作劫持的工做,我以为这个部分不是全部的业务框架设计者都能想到的,他包装了http.Handler,也对thrift的序列化流程进行了劫持,具体在劫持过程后,能有效的进行context注入,请求回放,全链路压测等工做。具体如何使用FSM实现thrift的protocol这块就没大听懂了。接着,就是提供了跨服务边界的context。这块下午在b站毛总的分享里面也提到了,基本上跨服务的context控制是golang微服务框架的标配了把。实现跨服务context以后,对TimeoutContext的使用就能作防雪崩的事情,每一个服务调用都会自动计算超时时间,能有效防止雪崩效应。数组

最终欢总很自豪的给咱们展现了这个框架服务的业务收益。缓存

参会

从欢总这个分享中,基本能对Golang的微服务框架所必须的特性都会有了很好的了解了。网络

如何用Go打造高性能路径规划和ETA引擎

这个也是我今天很期待的一个topic之一。以前半年在路网的项目中也投入了很多精力。对路网的生产,制造,使用流程都有了一些了解。其实我很想了解下Grab中路网在整个项目工程中的生产、服务、变动方面的东西。可是整个PPT听下来,和我想听到的描述方向仍是有一些不一样的。架构

胡泊描述的这个topic主要描述的是Grab地图团队中使用Golang作了哪些事情。他们使用OSM作地图数据,经过轨迹数据和算法来补充OSM中缺失的路网数据。他们称之为路网学习。而后轨迹数据和路网数据的mapmatch的匹配也是彻底由golang实现,具体实现使用的算法给咱们展现了很复杂的算法PPT,彻底听懵了。在司机轨迹定位处理和提供路况服务工程这块,花了好几个PPT说了下Grab在轨迹处理这块的一些优化点,好比对数据进行压缩,将数据存储分离,建立缓存层,引入大数据spark streaming处理等。后续又展现了路径规划和ETA的算法逻辑。并发

这个主题整个听下来只能用一脸懵逼来形容了。感受听了一个小时的算法和机器学习知识的课程。最后给的Go在GEO领域的一些开源的项目却是一大亮点,后续若是还有机会作路网相关的工做,能够研究一下这些项目。

参会

TiDB的Golang实践

早就听闻TiDB的大名,也没有机会在项目中实践使用。此次的分享,总体听下来对TiDB的一些架构设计也有了一些模模糊糊的印象了。

首先姚维先介绍了下 TiDB的 SQL处理层的模型结构。感受和mysql的SQL解析层的逻辑同样。主要是建立AST树,对这个树进行语法验证等处理。

然后画风一转,聊到了分布式系统的测试,像TiDB这种ToB的产品对测试要求更是严格了,由于一旦被企业使用,没法轻易进行升级。分布式系统的Error能够出如今任何地方,软件,硬件网络等都有可能出现问题,因此如何模拟这些各类场景下的错误是很重要的。姚维介绍了Pingcap内部的一个Schrodinger平台,薛定谔平台。不过没有很好展现一下这个平台的使用和有点。然后就花了大篇幅描述了一下FailPoint的测试注入。

咋听下,我没有能立马理解FailPoint的意思,模糊的理解到这个意思是以某种方式来模拟各类异常状况,好比panic,之类的错误Mock的方式。后来回家以后又去网上查了查,TiKV 源码解析(五)fail-rs 介绍大体说的也是这个意思。

参会

聊完failpoint以后,姚维很干货的分享了他们是如何测试代码是否又goroutine泄漏的。原理说白了就很简单,使用runtime.Stack在测试代码运行先后计算goroutine数量,固然我理解测试代码运行完成以后是会触发gc的。若是触发gc以后,发现还有goroutine没有被回收,那么这个goroutine颇有多是被泄漏的。这招是我以为从这个分享学到的最实用的一招之一。姚维能将一个看起来很不容易解决的问题用最直接的语言描述出来,我喜欢这样的分享方式。

再后面,就说到了TiDB是如何使用Chunk结构来存储表数据的。基本上在我理解就是使用Apache Arrow的方式,将TiDB的内容列式存储到Chunk结构中。一样的,姚维对Chunk的描述,引入,演变过程都用最直接的语言描述的很是清楚。

Testing; how, what,why

这个Dave大神的一个分享,不过期间安排的不是很好,下午一点,这是困点时间,再加上是英文阐述。我不得不认可,我在一个小时中间,大概打盹了半个小时。。。

Dave人很nice,贴心的把PPT的关键字都粗体。基本上Dave的整个Topic是在告诉你们如何进行单元测试,如何看测试覆盖率,测试的重要性,如何才是合理的测试用例。基本上他也是建议使用如今比较流行的数组测试,一个大数组中存储不一样的输入,输出,而后对这个大数组循环判断输入是否能产生指望输出。

我打盹以前听的内容是如何写单元测试,打盹以后听到的内容是测试是很是重要的。中间的部分,等PPT放出来的时候再具体看看把。

感受Dave大神说的比较务实,彻底是站在工程师编写代码的角度来讲如何写测试用例,没有平常听到的架构、设计等仍是稍微有点感动。可能基本功才是体现工程师素养的地方把。

Go业务基础库之Error & Context

这个是B站毛剑的分享。毛总上台以前,台下响起了雷鸣般的掌声,由于B站因为泄漏事件正处在焦点。毛总上台第一句话但愿你们提问缓解不要问一些不合适的问题。。。全场笑然。

毛总的干货仍是不少的,他的主题也是很踏实的,也是从业务框架的角度来讲,B站是如何处理Error和Context的。

关于Error,首先是使用WithStack保存堆栈信息,以方便查找根因。而且详细告诉咱们B站的大仓库是如何处理error的规则的。基本上听下来,就是对全部调用第三方的服务的错误都须要第一时间对error进行wrap,对于go-common库以前的error,统一在go-commmon层进行wrap处理。然后,再三告诉你们他在错误处理方面的一些最佳实践。包括什么时候打错误日志,什么时候直接透传,如何集中处理并发goroutine的错误,如何规划错误代码和错误信息等。总体听下来,毛总的这些建议,恐怕须要是从架构师视角才能得出来的干货。

参会

关于Context,实际上是在业界讨论很是多的了。总结下来,毛总对Context的观点有几个,首先强烈建议显示传递,即函数第一个参数为context。其次,强烈建议context覆盖全业务,包括日志,mysql,缓存等。再次,context的超时控制须要在流量入口处设置,而且越早设置越好,甚至说到了若是能提前到LSB路由分发以前设置会更好。还有,Context中存储的元数据都须要有哪些,包括调用者,调用地址,traceid等信息。在goroutine中如何传递context等都是很好的B站实践总结。

最终总结了下业务基础库的思考。

干货满满,问答环节也没人不识相的提起一些不合适的问题。这一part愉快结束。

Go同步和并发设计模型

这场严重超时,基本上讲了一个小时多时间。主要是作了一下Golang中锁、并发处理、内存模型的梳理。虽然讲的很细,不过我我的并不喜欢这样的梳理描述。一个是比较冗长,另一个是没有结合具体的业务场景来讲,光总结仍是有点虚了。

这个topic一共五个话题,基本同步原语,扩展同步原语,原子操做,channel,内存模型。基本就是把mutex,RWmutex,Cond,channel等并发相关的结构都梳理了一遍。

到最后已经没有很仔细听了,整体感受有点尴尬。

百度App Go语言实战

这个topic其实更像是百度效能平台的介绍。

首先百度对内部项目都会有一个工程能力评估图,对代码规范、测试、上线等流程都有本身的评估标准。其次介绍了一下百度内部对开发规范,开发工具,代码规范的介绍。比较有干货的是介绍了一下在实现开发框架server遇到的点,好比建立了一个goroutine池来控制goroutine的数量。server端出现TIME_WAIT过多问题的处理。然后介绍了一下百度的构建体系,如何自建镜像等。具体的实现逻辑没有细想,不过感受百度内部为了保证golang的代码交付质量,作了不少工做。最后还介绍了百度的代码检查工具,基本上也是使用AST解析代码,并和规则匹配来检查的。

用Golang搭建实时音视频云

这个是最后一个主题,因为前面的延迟,时间已经比较玩了,基本上会场上人数较少了一半多了。

具体的内容我也已经没有很高的注意力听了,基本上是聊的golang在WebRTC协议的服务端实现。上来先是例行解释下为什么技术选型使用golang,然后对WEBRTC的协议进行了说明,接着大体说了一下他们实现的具体架构,和他们遇到的问题。

比较有印象是他们遇到的问题。他们整个团队是以前各类语系的人都有,因而出现各类错误,好比阻塞for循环select的问题,好比日期格式化的问题。好比依赖库版本问题。总体听下来感受他们的CR仍是须要增强,可能百度的那套Code的检测机制就很合适。

不过总体听下来开阔了一下视野。

总结

其实一天若干个话题听下来,能记住的寥寥,可是晚上写这篇文章的时候,还能在头脑中浮现的,就是已经记在内心的干货了。

明天继续早起。

相关文章
相关标签/搜索