知乎问答服务Go语言重构实践
极客时间编辑部
讲述:杜力大小:2.14M时长:04:41
众所周知,知乎的主要编程语言使用的 Python。但随着知乎用户的迅速增长和业务复杂度的持续增加,对应的服务端的压力也越来越大,这时 Python 作为动态解释型语言,较低的运行效率和较高的后期维护成本带来的问题逐渐暴露出来。所以从 2017 年开始,知乎逐步在业务中使用 Go 语言,在刚刚结束的 QCon 全球软件开发大会上,知乎业务架构组技术负责人姚钢强分享了 Go 语言在知乎的实践历程。
在姚钢强看来,知乎使用 Go 语言的整个过程可以分为三个阶段,具体如下。
2017 年,知乎技术平台和个别业务开始尝试使用 Go 语言构建自己的系统,但此时配套的基础设施并不完全,所以在这一年中,架构团队开发了部分基础设施(RPC 框架、监控),并且使用 Go 语言重写了流量最大的内部 RPC 服务。
2018 年,随着知乎的发展,部分 Python 老服务资源消耗严重,于是团队开始针对评论和问答业务进行 Go 语言重写,在重写期间完善了基础设施(日志、降级、单元测试、Sentry),并确定了基础的代码组织结构。2018 年 7 月,知乎完成了评论业务的全部重写和问答业务主要流量接口的重写。2018 年底,知乎完成了对问答业务的 Python 与 Go 语言部分中基于业务的垂直拆分。
2019 年,知乎社区事业部开始针对占用资源较大的老 Python 业务进行 Go 语言重写,同时使用 Go 语言进行大部分新业务的开发。
知乎问答服务是知乎目前对外流量最大的服务,之所以要重构的原因是随着知乎的发展,流量不断增加,原先使用 Python 构建的项目占用了太多的资源。姚刚强谈到,重构时他们主要在 Java 和 Go 语言之间做选择,之所以选择了后者,是因为当时在知乎 Go 语言的基础设施相对于 Java 更全面,RPC 框架、监控等基础设施已经完备。另外,知乎 Go 语言的群众基础更好。
与新建一个系统不同,项目重构更多的是变换过程,所以,会面临许多挑战。知乎在重构问答服务时,主要的挑战有两个方面。
一是测试,问答服务是知乎很重要的项目,在保证单元覆盖的基础上,功能测试很复杂,读接口是同时发出请求,在线对比通过日志找出差异,写接口就必须在深入了解业务的基础上,与直接负责该业务的同事一起列出所有的 TestCase,先由两位工程师根据 TestCase 分别进行测试,然后交由 QA 进行二次验收。
二是之前的项目大量使用了 Python 的动态特性,尤其是类 GraphQL 的接口。所以,首先知乎团队分析了使用的类 GraphQL 接口,发现只有个别接口需要这种形式。其次,针对需要类 GraphQL 的解析进行一层抽象,单独一层(不使用反射)进行 URL 解析,然后将解析后字段对应到处理函数。
这次重构项目完成之后,相比之前的 Python 项目,资源占用减少了 70% - 80% ,复杂接口的性能有 50% 左右的提升。在重构问答服务的过程中,知乎团队也对 Go 语言的基础组件和基础设施进行了完善。
由此,知乎团队也总结了一些 Go 语言重构经验,姚钢强表示,如果是占用机器资源比较多,且之前是使用 Python、PHP、Ruby 构建的业务系统,那么使用 Go 语言重构会节省大量机器资源,提高性能。如果原先是使用 Java 构建的业务系统,那么不建议使用 Go 语言进行重构。
在使用 Go 语言重构项目的过程中,姚钢强认为以下三点是值得注意的:
重构业务系统的第一步永远是了解业务,所以必须要有负责当前业务的同学参与。如果没有了解业务就盲目进行重构,那么很容易出现 Bug,而且还可能导致未来系统难以维护;
项目开发之前要统一代码规范,配置好自动化的严格静态代码检,并且统一错误日志格式,做好调用链路跟踪的打点;
在放量阶段要谨慎一点,针对读接口要先对比,然后逐步灰度放量;针对写接口,要与业务方和 QA 确认好所有的业务 TestCase,工程师先自测,然后交给其他工程师或者 QA 做二次验证。
以上就是今天的内容,希望对你有所帮助。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
该免费文章来自《极客视点》,如需阅读全部文章,
请先领取课程
请先领取课程
免费领取
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(1)
- 最新
- 精选
- Geek_9c470d请问下读写接口重构前后的数据对比具体是怎么做的?
收起评论