找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

975

积分

0

好友

139

主题
发表于 4 天前 | 查看: 26| 回复: 0

Reddit 近期完成了一项重大的系统重构:将评论功能的后端从原有的 Python 单体架构,迁移至了由 Go 编写的领域驱动型微服务。此次迁移旨在解决其高写入量系统中长期存在的延迟与可扩展性问题,并为现代化其他核心服务奠定架构基础。

整个迁移过程遵循了一套分阶段的严谨策略,以确保功能正确性并最大限度减少对用户的影响。Reddit 工程师首先在 Go 中完整实现了所有评论的读取端点,并采用 tap-compare 测试方法进行验证。该方法会将一部分实时流量同时发送给新旧两套服务,对比二者的响应,但仅将原 Python 服务的响应返回给用户。这使得团队能够在生产环境中安全地捕捉潜在差异,为后续的流量切换做好准备。

图片
在 tap-compare 期间对评论后端进行双重写入(来源:Reddit 工程博客)

写入端点的迁移更为复杂,因为创建一条评论涉及多个数据存储:使用 PostgreSQL 进行持久化,Memcached 作为缓存,以及 Redis 用于变更数据捕获(CDC)事件。为了避免测试数据污染线上环境,Reddit 为 Go 服务部署了一套独立的、模式与生产环境镜像的“姊妹”数据存储。这套存储仅用于处理测试写入,使工程师能够在零风险的前提下验证系统行为。Reddit 团队一共测试了三个写入端点,横跨三个数据存储,形成了 18 条独立的验证路径。

迁移过程中也暴露了多个边缘案例。例如,早期的序列化不匹配导致 Python 服务无法反序列化由 Go 服务写入的数据,这一问题通过验证 CDC 事件消费者与旧服务的兼容性得以解决。数据访问模式的差异也增加了数据库压力:Python 单体使用 ORM,而 Go 服务倾向于直接写入,带来了更高的写入放大效应,这通过查询级别的优化得到了缓解。此外,在 tap-compare 测试期间,Python 写入生产数据与 Go 写入测试数据之间产生了竞态条件,工程师通过使用生产环境数据衍生的测试集改进了本地测试,从而解决了这一问题。

图片
在双重写入后进行 tap-compare 验证(来源:Reddit 工程博客)

根据 Reddit 团队的总结,新架构简化了评论系统的依赖链,同时为下游系统保持了完整的事件传递保证。转向领域驱动的微服务也为进一步解耦其他核心模型做好了准备,这些核心模型几乎覆盖了 Reddit 的所有用例:评论、账户、帖子和子版块。截至目前,评论和账户模型已完全从 Python 单体中迁移出来,帖子和子版块的迁移工作仍在进行中。一旦全部完成,所有四个核心模型都将运行在新的微服务架构之上。

Reddit 高级软件工程师 Katie Shannon 总结了此次重写的主要成果:

  • 与旧的 Python 系统相比,关键写入操作(包括创建、更新和增加端点)的 p99 延迟减少了一半。旧系统此前曾经历过高达 15 秒的延迟峰值。
  • 社区反馈显示评论创建速度更快,高峰流量期间的停机时间也减少了。

Shannon 指出,通过精心管理数据一致性和模式演进,成功解决了并发及 Go 语言特有的问题。Reddit 基础设施团队补充道,Go 原生的并发模型允许其使用比 Python 更少的 Pod 数量实现更高的吞吐量,这使其成为此次重构的理想选择。

原文链接: Reddit Migrates Comment Backend from Python to Go Microservice to Halve Latency




上一篇:AI Agent落地困境与破局:通用与垂直技术路线之争及行业洞察
下一篇:Forgejo自托管Git服务指南:社区驱动的Gitea轻量级分支部署与实践
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-17 17:36 , Processed in 0.127733 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表