美文网首页
GopherChina2017-4 微服务、go的坑、搜索引擎

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

作者: kree | 来源:发表于2017-04-16 17:14 被阅读0次

Grab:

从RoR转向Go,后台全用Go


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

Grab的Go实践

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


  • 分布式跟踪





  • 用context传递跟踪ID,调用方地址等,配合OpenTracing这个方法论

  • 测试

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

  • 端到端的测试


  • CodeReview





  • review的时候可以看到测试对代码覆盖的情况;单元测试覆盖率低于一定百分比,CI Build主动失败

使用Go遇到的坑

  • 问题一


  • 解决办法


  • 问题二


下一步计划


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


讯联:

Go的技术特点

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

技术选型

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

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


踩过的一些坑:

  • 变量作用域
  • channel操作

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

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

goroutine堆积的情况怎么处理?

  • goroutine的系统消耗比线程小

360:

Go在大规模搜索中的应用


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

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

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


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


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


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


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


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


相关文章

网友评论

      本文标题:GopherChina2017-4 微服务、go的坑、搜索引擎

      本文链接:https://www.haomeiwen.com/subject/uiqaattx.html