Reddit规则执行系统现代化改进
Reddit的安全工程团队最近发布了其规则执行系统的现代化改进,该系统旨在实时检测和处理违反政策的内容。新系统名为“规则执行V2”(REV2),其核心改进包括从传统的基于EC2的系统迁移到Kubernetes、使用GitHub和S3存储实现更好的规则版本控制,以及通过Flink Stateful Functions实现更高效的扩展。
REV2系统架构
REV2系统使用Lua脚本作为规则,这些脚本基于来自Kafka的特定事件(如用户发帖或评论)触发。系统架构的核心组件包括:
- Flink Stateful Functions 和 Baseplate 应用框架:用于执行从Apache Kafka主题中流出的Lua规则。
- GitHub:用于存储规则的配置和版本控制。
- S3存储:REV2的持续集成(CI)管道将规则持久化到S3,并定期检查规则更新。
- Kubernetes:整个系统运行在Kubernetes上。
规则执行流程
当系统确定需要采取行动时,REV2会将结构化的Protobuf操作发送到特定的Kafka主题。每个操作类型都关联一个唯一的主题,以确保更严格的模式和更细粒度的监控。安全操作工作器(Safety Actioning Worker)会消费这些主题并执行指定的操作。
REV1与REV2的对比
Reddit的初始规则引擎REV1运行在原始的EC2实例上,使用已弃用的Python 2.7。每个规则在REV1中作为独立进程运行,导致在添加更多规则时需要进行昂贵的垂直扩展。此外,REV1没有版本控制,规则变更历史难以追踪,且没有沙盒测试的暂存环境。
REV1的另一个问题是,它将所有操作写入单个Kafka主题,由Reddit的旧版单体Web应用程序R2消费。随着Reddit逐渐弃用R2,这种耦合成为一个问题。
Flink Stateful Functions的作用
Flink Stateful Functions是REV2系统的一个显著特点,它将应用程序的流处理层与业务逻辑分离。当系统通过Kafka接收消息时,Flink将其转发到远程服务端点进行处理,并在必要时将结果消息输出到Kafka出口。这种模块化方法使得流处理层和Web应用程序可以独立扩展,并且Web应用程序可以用任何语言编写。
时间旅行功能
REV2引入了一个新功能——时间旅行功能,允许对在特定规则开发之前创建的违反政策的内容进行追溯处理。当安全操作员使用此功能时,可以指定一个起始日期和时间,系统会调整规则消费者组的偏移量,处理大量历史事件,从而在事后清理网站。
规则更新的优化
为了提高规则更新的效率,Reddit引入了基于Amazon S3的轮询设置。在部署过程中,系统的CI阶段会上传包含所有规则配置的zip文件。Kubernetes的sidecar进程会定期检查S3中的文件变化,如果有更新,则下载并解压到共享的Kubernetes卷中。Baseplate应用程序通过文件监视器动态提供这些规则更新,无需完全重新部署。这种方法使规则编辑的部署时间提高了约90%。
总结
Reddit的REV2系统通过现代化的架构设计和新技术的引入,显著提升了规则执行的效率、扩展性和灵活性。从EC2到Kubernetes的迁移、使用Flink Stateful Functions、引入时间旅行功能以及优化规则更新流程,都是REV2系统的核心改进。这些改进使得Reddit能够更有效地实时保护用户免受违规内容的侵害。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。