Reddit发布REV2:基于Kubernetes、Kafka和Flink有状态函数的现代化规则执行

Reddit规则执行系统现代化改进

Reddit的安全工程团队最近发布了其规则执行系统的现代化改进,该系统旨在实时检测和处理违反政策的内容。新系统名为“规则执行V2”(REV2),其核心改进包括从传统的基于EC2的系统迁移到Kubernetes、使用GitHub和S3存储实现更好的规则版本控制,以及通过Flink Stateful Functions实现更高效的扩展。

REV2系统架构

REV2系统使用Lua脚本作为规则,这些脚本基于来自Kafka的特定事件(如用户发帖或评论)触发。系统架构的核心组件包括:

  • Flink Stateful FunctionsBaseplate 应用框架:用于执行从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能够更有效地实时保护用户免受违规内容的侵害。

阅读 44
0 条评论