正文
广告预测系统:该系统与上面所说的广告决策系统关系较紧密,最早实现是一个基于 Erlang 语言开发的调度系统,经过演变后的最新版本是使用 Go 语言进行的编写。演变的原因有三点:第一是性能的考虑,Go 提供了较好的库和工具链去帮助工程师团队找到其自身的瓶颈、分析并提高其性能;第二是团队适应性,FreeWheel 拥有上百位工程师,分布在全球亚、欧、美洲的一些国家,因此一致的工业化生产方式相比程序的美观优雅,会有更优先级需求,在让所有工程师共享一致的、可控的、容易分享的公共编程框架和规范上,Go 语言也更具优势;第三是相比之下 Go 在部署简易性上的特性。
Go 语言是 FreeWheel 公司目前主要力推的一个方向,在其看来,面向服务的架构的大环境中,Go 非常适合做一些功能相对独立、功能比较明确的微服务的语言。在结合已有的各种编程语言,计算框架(如 Hadoop、Java、Ruby、C++)的基础上,FreeWheel 把 Go 语言定位成用来实现轻量级服务或 API 的缺省编程语言,将之与用来完成更小粒度工作的 Python 结合在一起,就构成了 FreeWheel 的整个技术语言栈 。
虽然从 2012 年 Go 1.0 发布到团队相继采用 Go 来编写项目,这中间经历了大致三年左右的时间,但由于在 GC 等许多问题的克服上需要 Go 本身去做一部分迭代,FreeWheel 也需要把技术对客户的影响控制在一个可控的范围内,因此作为一家 B-to-B 企业,其采用了更为渐进的方式将 Go 语言应用到自身的生产平台上。
在这个过程中,FreeWheel 也经历过两个较为重要的“坑”。
如多数人所知道的一样,Go 语言垃圾回收器存在一定的缺陷,特别是容易导致整个进程不可预知的间歇性停顿。像某些大型后台服务程序,如游戏服务器、APP 容器等,由于占用内存巨大,其内存对象数量极多,GC 完成一次回收周期,可能需要数秒甚至更长时间,这段时间内,整个服务进程是阻塞的、停顿的,在外界看来就是服务中断、无响应。FreeWheel 在使用 Go 1.4 版本时也遇到过类似问题:广告预测团队用 Go 来实现调度器,平常运行的时候没有问题,但一旦触发 1.4 版本下 GC 的时候,该系统的 downgrade 非常厉害,导致任务的堆积非常严重,触发报警,同时其处理性会下降很多,也会影响其他上下游系统的正常运转。
于是,FreeWheel 在当时主要采取了三种对策: