内容提要
这篇文章介绍了Reddit的架构演进历程,包括早期架构、迁移至AWS、GraphQL联邦、数据复制、媒体元数据管理、图片优化、用户保护、Feed架构和从Thrift到gRPC的迁移。这些变化使得Reddit能够应对用户规模和复杂性的增长,并提供更好的性能和用户体验。
延伸解读
从单体到微服务的渐进式迁移策略
Reddit在从Python单体应用向Go微服务迁移时,面临GraphQL Federation规范不支持渐进式流量迁移的挑战。他们采用蓝绿部署,通过负载均衡器在网关和子图之间分配流量,并可根据配置调整单体和新子图处理的流量比例。这种策略允许逐步增加新子图的流量,同时监控错误率和延迟,并在出现问题时快速回退到单体,确保了迁移过程的稳定性。
数据复制:从WAL归档到CDC流式处理
早期Reddit使用WAL归档进行数据复制,但存在数据不一致、模式变更问题和EC2实例脆弱性等缺陷。转向基于Debezium和Kafka Connect的CDC方案后,实现了实时数据复制到多个目标系统,且用轻量级Pod替代了笨重的EC2实例,提高了可靠性和可扩展性。这一转变反映了现代数据管道对实时性和弹性的要求。
媒体元数据存储的选型与迁移
Reddit需要统一分散的媒体元数据,并支持每秒10万次读取和低于50毫秒的延迟。在Postgres和Cassandra之间,他们选择了AWS Aurora Postgres,因为Cassandra的临时查询调试困难且存在数据非规范化风险。迁移采用双写、回填、双读、监控和逐步切流等步骤,最终实现了p50 2.6毫秒、p90 4.7毫秒、p99 17毫秒的读取延迟,且比旧系统快50%。
图像优化内部化:成本与性能的双赢
Reddit将图像优化从第三方供应商迁移到内部,构建了Gif2Vid和图像优化服务。Gif2Vid将GIF转码为MP4,成本降至原来的0.9%,p99缓存未命中延迟从20秒降至4秒;图像优化服务使用govips处理其他图像,静态图像字节数减少约20%。这一举措不仅降低了成本,还提升了终端用户体验,体现了将核心功能内部化的价值。
Q&A
Reddit的架构演进经历了哪些重要阶段?
Reddit的架构演进经历了从Lisp到Python的重写、迁移至AWS、采用GraphQL和GraphQL Federation、实时数据复制、媒体元数据管理、图像优化、用户保护和Feed架构重构等重要阶段。
Reddit是如何处理数据复制的?
Reddit采用Debezium和Kafka Connect进行实时数据复制,以提高数据复制的可靠性,解决早期方法中的不一致性和脆弱性问题。
Reddit在图像优化方面做了哪些改进?
Reddit将图像优化功能内部化,构建了Gif2Vid和图像优化服务,以降低成本并提高用户体验,显著减少了图像处理的延迟和费用。
Reddit如何实现用户内容的实时保护?
Reddit开发了REV2规则引擎,通过流式处理技术实时监控和管理违反平台政策的内容,确保用户安全。
Reddit的Feed架构是如何提升用户体验的?
Reddit重构了Feed架构,采用服务器驱动的UI,减少了客户端负担,提高了开发效率和用户的互动体验。
Reddit为什么从Thrift迁移到gRPC?
Reddit从Thrift迁移到gRPC是因为gRPC提供了更好的性能、HTTP2支持和与云原生技术的兼容性,尽管迁移成本较高,但长期维护成本更低。