董晓聪:2020 年,Go 相对成熟,公司内部技术相关的很多人员或多或少有些 Go 的项目背景,加之 kubernetes 以 Go 语言为基础,大家对选择 Go 语言没有那么反对,但对具体哪些模块切换到 Go 上是存在讨论空间的。起初,大部分业务人员处于观望状态,期望我们可以拿出过硬的成功案例,我们从业务中台入手,改造后收益明显,越来越多的团队加入。
吕亚霖:PHP 的生态环境比较成熟,社区活跃度不高,作业帮当时内部的生态和工具比较成体系化,是一个典型的 ODP 体系(ODP 最早是百度提出来的,是在“鸟哥”惠新宸开发的 PHP 框架 Yaf 基础上做的调整,整合了一些 Web 框架以外的东西,比如 Nginx、PHP 扩展等)。GO 当时的生态还处在演化过程中,GO 的包管理工具 go mod 发布了测试版本,还没有正式推出,但 Go 的社区活跃度非常高,国内外的大厂在 Web 和基础组件场景都有非常优秀的实践和落地经验。
InfoQ:当时,内部研发团队的语言背景大概是什么?
吕亚霖:基础架构团队的主语言背景是 C++ 和 Go。因为当时 kubernetes 已经流行,kubernetes 体系内均基于 Go 语言实现,我们当时也在做容器化,因此在 2019 年前后招聘了很多有 Go 语言基础的工程师。业务侧研发人员较多,语言背景主要是 PHP 和 C++,整个切换也是业务线主力修改。基础架构部主要负责 Go 的运行时、框架及生态工具的建设,给出业务线案例,并完成协助工作,比如帮助业务查问题。
重写过程遇到的坎儿
二是快速召回升级,最初的版本很容易出现问题,这就需要快速升级到新版本,但因为一个包的使用者众多,所以难以在问题出现时一一告知升级,我们建立了反向包管理工具平台。通过 CI 分析,知道所有使用方使用的是哪个包版本。对某个版本的使用方都明确建立索引关系。
三是 PHP 自身的问题,PHP 属于弱语言类型,这种弱语言类型和特种函数带来的问题都需要在 Go 里面兼容,但实际上很多问题都是上线后发现的,比如加解密的私有库。
经验复盘及后续优化
InfoQ:Go 语言哪些优势让团队觉得比较爽?
蒋帅:一是 Go 的社区非常活跃,对个人和公司来说,有很多交流和学习的可能,包括对团队的招聘的维护都有帮助;二是高性能,很多模块从 PHP 切到 Go 之后,性能提升显著,尤其是晚高峰时的性能、吞吐量以及单核支撑的 QPS;三是功率和生态在不断演进,Go 最初的包管理工具不是特别理想,后来社区推出了公共的包管理工具,而 PHP 的社区维护、工具完善度以及生态与 Go 相比存在明显差距。
与 C++ 相比,Go 语言的开发效率更高,性能略差,但属于在性能和效率之间达到了很好的平衡。
InfoQ:编程语言的调整对架构有造成什么影响吗?
蒋帅:首先,编程语言在架构中起到承上启下的作用,承上是业务规范及研发质量,启下是云原生架构落地,只有编程语言这一层没有问题,才能很好地把上下连接起来。以 PHP 为例,如果基于 PHP 对云原生做适配,PHP-FPM+nginx 以及各种私有库依赖打出来的包动辄就是几百兆,而且同时拉起几千个 POD 很容易出现延迟的问题,在 mesh 的协议支持上也不友好。而 Go 只需要 5-10 兆,对落地容器化和服务治理都十分友好。
InfoQ:事后复盘有哪些值得优化的地方?
蒋帅:一是因为切换为 Go 语言的改动非常大,尤其是在微服务架构下,需要一个稳定、高效的开发测试环境,如果没有服务治理体系的支撑,很难在本地走完整个流程。
蒋帅:经过两年的发展,作业帮的 GO 语言从 0 演化成服务端使用数量最多的开发语言,已有 GO 项目全部基于 ZGIN 构建(ZGIN 基于 gin 衍生而来,是面向 web 服务的开发框架,提供了开箱即用的常用组件和功能,侧重通用性和稳定性,兼顾性能和时延,构建了符合公司业务场景的生态体系)。服务模块数量达 600 余个,服务 POD 数量在 1 万以上。
面向未来,我们将继续从几个方向进行优化,一是安全方向,其他语言我们都有 RASP 的防护,我们目前在 GO 上尝试通过 eBPF 内核结合用户态来运行 RASP。
二是适当优化性能,我们现有服务器,大多数以大规格裸金属服务器(256 核)为主,我们针对特定硬件的 numa 拓扑特性做 GMP 调度优化,其次我们服务基本以容器运行为主,自动适配容器场景下 POD 的 limit。
InfoQ:我们有希望 Go 社区可以增加的特性或者优化吗?
蒋帅:一是 GO 官方团队还是优化下 GC 问题,因为我们发现有时候 GO 的 GC 频繁且耗用资源较多,我们是通过自适应 GC 优化了该场景下的问题。另一个是 Go 运行时的可观测性,我们只能在内核上通过 eBPF 去搞,但实际上这个 Runtime 的观测性应该由 Go 的相关团队负责,我们是将能力往下沉了。
InfoQ:你觉得用什么样的编程语言与研发团队的规模或者协作模式之间会有关联吗?
蒋帅:我觉得和团队规模没有关系,可能与业务场景及语言生态有关系,以作业帮为例,我们在底层检索系统、搜索引擎和 OCR 上都是 C++,面向业务的 Web 服务都是 Go,大数据用的是 Java,人工智能用 Python 的比较多,我觉得一旦公司的产研到了千人规模以上,编程语言一定会呈现多样化。但是会有一个主业务语言,可能一半的人都在用该语言。