GopherChina2017-4 微服务、go的坑、搜索引擎

Grab:

GopherChina2017-4 微服务、go的坑、搜索引擎_第1张图片

从RoR转向Go,后台全用Go


GopherChina2017-4 微服务、go的坑、搜索引擎_第2张图片
GopherChina2017-4 微服务、go的坑、搜索引擎_第3张图片
GopherChina2017-4 微服务、go的坑、搜索引擎_第4张图片
GopherChina2017-4 微服务、go的坑、搜索引擎_第5张图片

用Go和jenkins打造了一套CI系统

Grab的Go实践

  • go的代码存储于单个的代码仓库


    GopherChina2017-4 微服务、go的坑、搜索引擎_第6张图片
  • 分布式跟踪


    GopherChina2017-4 微服务、go的坑、搜索引擎_第7张图片

    GopherChina2017-4 微服务、go的坑、搜索引擎_第8张图片

    GopherChina2017-4 微服务、go的坑、搜索引擎_第9张图片

    GopherChina2017-4 微服务、go的坑、搜索引擎_第10张图片
  • 用context传递跟踪ID,调用方地址等,配合OpenTracing这个方法论

  • 测试

  • 单元测试(使用了testing.T这个包,Mock的使用,对数据库等全局单例的Mock是个坏实践,改为将数据库定义为接口,作为依赖注入)

  • 端到端的测试


    GopherChina2017-4 微服务、go的坑、搜索引擎_第11张图片
  • CodeReview


    GopherChina2017-4 微服务、go的坑、搜索引擎_第12张图片

    GopherChina2017-4 微服务、go的坑、搜索引擎_第13张图片

    GopherChina2017-4 微服务、go的坑、搜索引擎_第14张图片

    GopherChina2017-4 微服务、go的坑、搜索引擎_第15张图片
  • review的时候可以看到测试对代码覆盖的情况;单元测试覆盖率低于一定百分比,CI Build主动失败

使用Go遇到的坑

  • 问题一


    GopherChina2017-4 微服务、go的坑、搜索引擎_第16张图片
  • 解决办法


    GopherChina2017-4 微服务、go的坑、搜索引擎_第17张图片
  • 问题二


    GopherChina2017-4 微服务、go的坑、搜索引擎_第18张图片

下一步计划


GopherChina2017-4 微服务、go的坑、搜索引擎_第19张图片

函数式中,每个docker跑的是一个函数


讯联:

GopherChina2017-4 微服务、go的坑、搜索引擎_第20张图片

Go的技术特点

  • 开发效率高
  • 天生并发支持
  • 简洁的错误处理:defer、panic、recover

技术选型

  • 安全性
  • 漏洞少,因为语言新,第三方的东东少(java的漏洞多为第三方组建引入)
  • 有一个网站可以查看语言的漏洞统计
  • 稳定性
  • 高可用架构,应用可无状态扩展
  • 吞吐量
  • 并发处理能力
    • 以http和rsa作为测试场景,go比java效率高
    • json解析场景,java的效率更高
    • 在一个秒杀系统的挡板应用上,感受到了go相比java在吞吐量上的优势
GopherChina2017-4 微服务、go的坑、搜索引擎_第21张图片

15年为单体架构,17年为微服务架构,全部使用go实现


GopherChina2017-4 微服务、go的坑、搜索引擎_第22张图片

踩过的一些坑:

  • 变量作用域
  • channel操作

goroutine没有优先级,怎么搞定类似线程优先级的问题,让高优先级的被调度到?

  • 从实现角度来考虑,可以用一些其它的策略,如触发机制

goroutine堆积的情况怎么处理?

  • goroutine的系统消耗比线程小

360:

Go在大规模搜索中的应用


GopherChina2017-4 微服务、go的坑、搜索引擎_第23张图片

ES和HBase在规模和效率上难以满足要求

GopherChina2017-4 微服务、go的坑、搜索引擎_第24张图片

多个doc.gz连成一个hadoop文件,gz格式在分段保存上有优势

GopherChina2017-4 微服务、go的坑、搜索引擎_第25张图片
GopherChina2017-4 微服务、go的坑、搜索引擎_第26张图片
GopherChina2017-4 微服务、go的坑、搜索引擎_第27张图片

用差分做了压缩,仍然有2.4T


GopherChina2017-4 微服务、go的坑、搜索引擎_第28张图片
GopherChina2017-4 微服务、go的坑、搜索引擎_第29张图片
GopherChina2017-4 微服务、go的坑、搜索引擎_第30张图片

为了简单,使用了CGO和C++配套


GopherChina2017-4 微服务、go的坑、搜索引擎_第31张图片
GopherChina2017-4 微服务、go的坑、搜索引擎_第32张图片
GopherChina2017-4 微服务、go的坑、搜索引擎_第33张图片
GopherChina2017-4 微服务、go的坑、搜索引擎_第34张图片
GopherChina2017-4 微服务、go的坑、搜索引擎_第35张图片
GopherChina2017-4 微服务、go的坑、搜索引擎_第36张图片

协程中再起协程,协程是临时创的,没使用协程池或连接池来做协程复用


GopherChina2017-4 微服务、go的坑、搜索引擎_第37张图片
GopherChina2017-4 微服务、go的坑、搜索引擎_第38张图片
GopherChina2017-4 微服务、go的坑、搜索引擎_第39张图片
GopherChina2017-4 微服务、go的坑、搜索引擎_第40张图片

消息队列用的channel,而非redis之类来实现


GopherChina2017-4 微服务、go的坑、搜索引擎_第41张图片
GopherChina2017-4 微服务、go的坑、搜索引擎_第42张图片
GopherChina2017-4 微服务、go的坑、搜索引擎_第43张图片
GopherChina2017-4 微服务、go的坑、搜索引擎_第44张图片
GopherChina2017-4 微服务、go的坑、搜索引擎_第45张图片

开源
嵌套依赖目前还没有很好的解决,于是all in one,但一些开发者还是使用了拆成5个微服务的方式


GopherChina2017-4 微服务、go的坑、搜索引擎_第46张图片
GopherChina2017-4 微服务、go的坑、搜索引擎_第47张图片

总结
对象池导致代码可读性差,目前gc没有那么明显,除非极端情况,否则不太需要了


GopherChina2017-4 微服务、go的坑、搜索引擎_第48张图片

你可能感兴趣的:(GopherChina2017-4 微服务、go的坑、搜索引擎)