作者 | Leela Kumili

  译者 | 张卫滨

  Reddit 完成了对其评论后端的重大重构,从传统的 Python 系统迁移到了特定领域的 Go 微服务,以提高性能和可靠性。这一变化解决了 Reddit 的最高写入系统中长期存在的延迟和可扩展性挑战,同时为现代化其他核心模型奠定了基础。

  迁移遵循了一个多阶段的策略,旨在保持正确性并最小化用户中断。Reddit 工程师首先在 Go 中实现了所有评论读取端点,并使用 tap-compare 测试方法进行验证。在这种方法中,一部分实时流量被发送到新服务,将其响应与旧的 Python 系统进行比较,并且只将原始响应返回给用户。这使得工程师能够在完全切换流量之前,在生产环境中安全地检测差异。

  写入操作更为复杂,因为评论创建涉及多个数据存储:PostgreSQL 用于持久化,Memcached 用于缓存,Redis 用于 变更数据捕获(change data capture,CDC) 事件。为了防止与生产数据冲突,Reddit 在 tap-compare 测试期间为 Go 服务部署了姊妹数据存储。这些存储镜像了生产环境的模式,但仅用于处理写入的测试,使团队能够在不承担实时数据损坏的风险下验证系统的行为。Reddit 一共测试了三个写入端点,跨越三个数据存储,创建了 18 个单独的验证路径。

  Reddit 将其评论功能的后端从 Python 迁移为 Go 微服务

  在 tap-compare 期间对评论后端进行双重写入(来源:Reddit 工程的帖子)

  迁移也暴露了几个边缘案例,例如,早期序列化不匹配意味着 Python 服务最初无法反序列化由 Go 写入的数据,这通过验证 CDC 事件消费者与旧服务的对比来解决。数据访问的差异性也导致了数据库压力:Python 单体使用 ORM,而 Go 会直接写入,产生了更高的写入放大负载,这通过查询级优化得到了缓解。此外,在 tap-compare 期间,Python 写入生产数据与 Go 写入和比较读取之间发生了竞态条件。工程师通过在运行 tap-compare 之前使用生产派生数据改进本地测试来解决这些问题。

  Reddit 将其评论功能的后端从 Python 迁移为 Go 微服务

  在双重写入后进行 tap-compare 验证(来源:Reddit 工程帖子)

  根据 Reddit 团队的说法,新架构简化了评论系统的依赖链,同时为下游系统保持了完整的事件传递保证。转向特定领域的微服务还使平台为进一步分解其他核心服务做好了准备,这些服务是四个核心模型的一部分,几乎涵盖了所有用例:评论、账户、帖子和子版块。截至本文撰写时,这两个模型,即评论和账户,已从 Python 单体完全迁移,而帖子和子版块的迁移正在进行中。一旦完成,所有四个核心模型将在新的微服务架构下实现现代化。

  Reddit 的高级软件工程师 Katie Shannon 总结了重写的结果:

  与旧的 Python 系统相比,关键写入操作,以及创建、更新和增加端点的 p99 延迟,减少了一半,旧系统之前曾经历过高达 15 秒的峰值。

  社区反馈显示了更快的评论创建和在高峰流量期间减少的停机时间。Shannon 指出,仔细管理数据一致性和模式演变,解决了并发和 Go 的特定问题。Reddit 基础设施团队补充说,Go 的并发性允许以较少的 pod 实现比 Python 更高的吞吐量,使其成为首选方案。

  原文链接:

  Reddit Migrates Comment Backend from Python to Go Microservice to Halve Latency()

  声明:本文为 InfoQ 翻译,未经许可禁止转载。

  今日好文推荐