Discord 开源其内部事件流决策引擎 Osprey。它每秒能够评估 230 万条规则,每天能够处理 4 亿次操作。Osprey 采用 Rust 协调器和无状态 Python 工作节点构建,提供了一种用于实时威胁检测和缓解的水平可扩展架构。该项目由 ROOST 组织和 internet.dev 合作管理。作为事件流决策引擎,Osprey 负责调查实时平台活动并执行自动响应。鉴于其提供的可扩展架构,该项目已在 Bluesky 和 Matrix.org 等的网络中获得了早期采用。这次开源转型将这个专有工具转变成了可供更广泛工程社区使用的可配置资源。
Osprey 根据可动态加载的规则来评估 JSON 格式的事件负载(称为 Action)。这些规则使用 SML (一种具有 Python 语法的领域特定语言,支持静态验证)编写。在便于安全分析师使用的同时,该语言还为软件工程师提供了可扩展性。开发者可以使用标准 Python 编写的用户定义函数(UDF)来扩展该引擎。UDF 为 Osprey 定义了标准库,并支持外部 API 调用或机器学习模型集成。该系统会追踪特定目标(称为“实体”)的状态,从而使操作员能够为其添加标签并进行分类。
在对 Action 进行处理后,该引擎会生成判定结果或效果,并将其路由到可配置的输出接收端。开源版本使用 Pluggy Python 库为这些接收端提供集成点,取代了内部的 Discord 依赖项。标准部署使用 Apache Kafka 将结果路由到 Apache Druid 集群,通过 Osprey UI 提供实时分析。
InfoQ 对 roostorg/osprey GitHub 存储库的分析显示,该引擎采用了一种解耦的多语言架构,旨在处理持续的事件吞吐量。为了管理高并发,该系统采用了一个用 Rust 编写的协调器服务。存储库代码显示,协调器管理来自消息队列的异步事件流,并优先处理同步 gRPC 请求,从而保持延迟的稳定。
规则评估发生在无状态 Python 工作节点上。为了优化执行速度,Python 工作节点会在启动时将 SML 规则解析为抽象语法树(AST)。这一措施实现了编译成本前置,最大限度地减少了每个事件的处理时间。规则通过 ETCD 分发到工作节点,支持在生产环境中进行动态更新,而无需重新部署应用程序。由于工作节点是无状态的且通过 Docker 实现了容器化,所以组织可以水平扩展处理能力以适应流量峰值。Rust 协调器用于流量整形,再加上可扩展的 Python 工作节点,为持续事件评估提供了一个有弹性的系统。
采用 Rust 和 Python 多语言架构正在成为高吞吐量系统的标准模式。在这种模式下,Rust 作为数据平面,管理网络流量、内存分配和高并发执行。Python 充当控制平面,处理业务逻辑、机器学习集成和用户 API。这种分离使工程团队能够最大化硬件利用率,同时保证应用层开发速度。Osprey 利用这种模式进行事件流处理,它也是广泛采用的数据工具的基础。例如,Polars DataFrame 库和 Hugging Face tokenizers 依靠 Rust 核心进行计算密集型操作,同时暴露 Python 控制平面以提高可用性。
声明:本文为 InfoQ 翻译,未经许可禁止转载。





