RSS

gRPC-Go 工程实践

新的一年伊始,也是我参与 gRPC-Go 项目的第一个完整年份即将结束之际,我想借此机会提供 gRPC-Go 项目开发状态的更新,并介绍我们如何管理该项目。对我个人而言,这是我首次有意义地贡献的开源项目,因此这一年对我来说是一段学习的经历。在这一年里,团队不断改进我们的工作习惯和沟通方式。我仍然看到有改进的空间,但我相信我们现在比一年前的情况要好得多。

仓库健康状况

当我刚加入 gRPC-Go 团队时,他们已经有几个月没有前任技术主管了。当时,我们有45个未解决的PR(Pull Request,拉取请求),其中最老的已经超过一年。作为一名新的团队成员和维护者,积压的陈旧PR使得评估优先级和理解项目状况变得困难。对于我们的贡献者来说,忽视PR既是不尊重的表现,当我们需要他们进行rebase(变基)时也会带来不便,因为我们已经提交了其他代码。为了解决这个问题,我们齐心协力地合并或关闭了所有这些PR,现在我们每周举行会议,审查每个活跃PR的状态,以防止这种情况再次发生。

与此同时,我们有103个未解决的问题(issue),其中许多已经被修复、过时或未经分类。从那时起,我们修复或关闭了其中的85个,并建立了一个流程,确保每周轮流分类和优先处理新问题。与我们的PR类似,我们也会在每周的会议中审查已分配和高优先级的问题。

我们针对新问题和PR的服务水平目标 (SLO) 是:在1周内完成分类和首次响应。

我们还重新设计了问题和PR的标签,以帮助组织管理。我们通常会为每个问题应用优先级(P0-P3)和类型(例如,Bug、Feature 或 Performance)标签。我们还有一系列在各种情况下使用的状态标签。类型标签也应用于PR,以帮助生成我们的发布说明。

版本控制与向后兼容性

我们最近记录了我们的版本控制策略。我们的目标是在有限的情况下(包括实验性API和缓解安全风险,尤其是#1392)之外,保持完全的向后兼容性。如果您发现行为回归,请随时在我们的仓库中提交一个问题(请务必合理)。

gRFC

gRPC 提案仓库包含需要预先设计的 gRPC 重大功能变更提案,这些提案被称为 gRFC。此流程的目的是提供可见性并征求社区的反馈。每项变更都会在我们的邮件列表中进行讨论和辩论,然后才实施。我们在进行破坏向后兼容性的元数据变更(gRFC L7)之前,以及在设计新的解析器/负载均衡器 API(gRFC L9)时,都利用了这一流程。

回归测试

我们仓库中的每个PR都必须通过我们的单元测试和端到端测试。我们当前的测试覆盖率为85%。每当发现回归时,我们都会添加一个覆盖失败场景的测试,既是为了向我们自己证明问题已通过修复解决,也是为了防止它将来再次发生。这也有助于我们提高整体覆盖率。我们还打算重新为所有PR启用覆盖率报告,但以非阻塞方式进行(相关问题)。

除了正确性测试之外,任何我们怀疑会影响性能的PR都会通过我们的基准测试。我们在开源仓库和谷歌内部都有一套基准测试。这些测试包含了我们认为对用户最重要的各种工作负载,包括流式和一元调用,其中一些专门设计用于测量我们的最佳QPS(每秒查询数)、吞吐量或延迟。

发布

gRPC-Go 的通用可用版本 (GA release) 于2016年7月与其他语言版本一同发布。从那时起到2016年底,团队进行了几次补丁发布,但都没有包含发布说明。我们随后的发布在规律性(每六周进行一次次要发布)和发布说明的质量上都有所改进。我们对补丁发布也反应迅速,根据需要或对于更严重的问题,在一周内将错误修复回溯移植到旧版本。

在进行发布时,除了我们仓库中的测试,我们还会运行一套完整的与其他 gRPC 语言实现之间的互操作性测试。这个过程对我们来说运行良好,我们将在未来的博客文章中详细介绍。

非开源工作

我们在开发 gRPC 时采取了“开源优先”的方法。这意味着,在可能的情况下,gRPC 的功能会直接添加到开源项目中。然而,为了在谷歌的基础设施中工作,我们的团队有时需要在 gRPC 之上提供额外的功能。这通常通过诸如统计 API拦截器自定义解析器之类的钩子实现。

为了使谷歌内部的 gRPC 版本与开源版本保持同步,我们每周或按需进行导入。在导入之前,我们会运行谷歌内部所有依赖 gRPC 的测试。这为我们提供了另一种在开源发布之前发现问题的方式。

展望未来

在2018年,我们打算继续保持同样的做法,并维持我们解决问题和接受项目贡献的服务水平目标。我们还希望更积极地为那些希望贡献的人标记“寻求帮助”的标签,以便他们有更多问题可供选择。

对于 gRPC 本身,我们目前的主要关注点之一是性能,我们希望这将透明地惠及我们的许多用户。在短期内,我们正在完成一些令人兴奋的改变,这些改变应能实现在高并发下将延迟降低30%以上,从而使QPS提升约25%。这项工作完成后,我们还有一份其他性能问题列表,将会在接下来处理。

在用户体验方面,我们希望提供更好的文档,并开始通过更完善的注释和更多示例来改进我们的 godoc。我们希望提升使用 gRPC 的整体体验,因此我们将密切合作开展与分布式追踪、监控和测试相关的项目,以使 gRPC 服务在生产环境中更易于管理。我们希望做得更多,并且希望从这些方面着手并听取反馈,能帮助我们稳步推出改进。