专栏名称: 细说云计算
关注云平台的网络技术、存储技术,以及少量架构技术。
目录
相关文章推荐
51好读  ›  专栏  ›  细说云计算

FreeWheel 基于 Go 的实践经验漫谈

细说云计算  · 公众号  · 架构  · 2017-07-31 21:39

正文

请到「今天看啥」查看全文


  • 广告预测系统:该系统与上面所说的广告决策系统关系较紧密,最早实现是一个基于 Erlang 语言开发的调度系统,经过演变后的最新版本是使用 Go 语言进行的编写。演变的原因有三点:第一是性能的考虑,Go 提供了较好的库和工具链去帮助工程师团队找到其自身的瓶颈、分析并提高其性能;第二是团队适应性,FreeWheel 拥有上百位工程师,分布在全球亚、欧、美洲的一些国家,因此一致的工业化生产方式相比程序的美观优雅,会有更优先级需求,在让所有工程师共享一致的、可控的、容易分享的公共编程框架和规范上,Go 语言也更具优势;第三是相比之下 Go 在部署简易性上的特性。

  • Go 语言是 FreeWheel 公司目前主要力推的一个方向,在其看来,面向服务的架构的大环境中,Go 非常适合做一些功能相对独立、功能比较明确的微服务的语言。在结合已有的各种编程语言,计算框架(如 Hadoop、Java、Ruby、C++)的基础上,FreeWheel 把 Go 语言定位成用来实现轻量级服务或 API 的缺省编程语言,将之与用来完成更小粒度工作的 Python 结合在一起,就构成了 FreeWheel 的整个技术语言栈 。

    FreeWheel 在 Go 上所经历的“坑”

    虽然从 2012 年 Go 1.0 发布到团队相继采用 Go 来编写项目,这中间经历了大致三年左右的时间,但由于在 GC 等许多问题的克服上需要 Go 本身去做一部分迭代,FreeWheel 也需要把技术对客户的影响控制在一个可控的范围内,因此作为一家 B-to-B 企业,其采用了更为渐进的方式将 Go 语言应用到自身的生产平台上。

    在这个过程中,FreeWheel 也经历过两个较为重要的“坑”。

    GC 的问题

    如多数人所知道的一样,Go 语言垃圾回收器存在一定的缺陷,特别是容易导致整个进程不可预知的间歇性停顿。像某些大型后台服务程序,如游戏服务器、APP 容器等,由于占用内存巨大,其内存对象数量极多,GC 完成一次回收周期,可能需要数秒甚至更长时间,这段时间内,整个服务进程是阻塞的、停顿的,在外界看来就是服务中断、无响应。FreeWheel 在使用 Go 1.4 版本时也遇到过类似问题:广告预测团队用 Go 来实现调度器,平常运行的时候没有问题,但一旦触发 1.4 版本下 GC 的时候,该系统的 downgrade 非常厉害,导致任务的堆积非常严重,触发报警,同时其处理性会下降很多,也会影响其他上下游系统的正常运转。

    于是,FreeWheel 在当时主要采取了三种对策:

    • 一、并不把 Go 用在非常关键的、对服务进程稳定性要求较高的系统里;







    请到「今天看啥」查看全文