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

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没有那么明显,除非极端情况,否则不太需要了


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Poseidon 系统是由 360 开源的日志搜索平台,目前已经用到了生产环节中,可以在数百万亿条、数百 PB 大...
    肆虐的悲傷阅读 603评论 0 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,083评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,925评论 25 709
  • 9月份的目标是什么呢? 1.晨读与话题,至少20篇 2.读书 精选2本,写读书笔记总结 3.古筝 练习 两...
    宋明媚阅读 137评论 0 2