Discord x Pulsar: 使用 Pulsar、Flink 和 Iceberg 搭建流式机器学习平台

本文整理自 Discord 机器学习工程师 David Christle 在 Pulsar Summit NA 上的演讲内容,一起来看 Discord 是如何基于 Pulsar 实现兼顾安全和个性化功能的实时流式机器学习平台的~

1. 背景

Discord 是一个实时⾳视频通信平台,⽀持⽂本/语⾳/视频频道交流,广泛应用于1对1、中小团队或⼤型社区的在线交流场景,能支持用户从私密聊天到百万级社区通信的不同需求。平台于2015年创立,最初在游戏社区中流行起来,目前已扩展到多个领域,月活用户达1.5亿。

2. 挑战

Discord 面临的核心挑战是升级其实时流式机器学习平台,以应对安全和个性化需求,例如限制垃圾信息访问或保护用户账户免遭入侵。其原先架构是为启发式规则设计的,而非机器学习。为了寻求一个稳健、可扩展且实时的解决方案,他们探索了集成 Apache Pulsar、Flink和 Iceberg 的方案。

2.1 需求

“该系统的运行速度和可扩展性是关键所在。”
“该框架非常强大,支持过滤、转换、连接、聚合等操作;你在数据处理方式上拥有极大的自由度,即使在实时场景下效率也非常高。这些管道可以非常简单,比如事件采集和去重;也可以用来完成 ETL 任务。我们能在流数据上以极低延迟进行机器学习。”

安全

  • 反垃圾邮件:通过跨职能团队协作,最大程度避免⽤户对垃圾内容和垃圾邮件发送者的接触

  • 账户安全:主动保护⽤户账户免遭⼊侵,并在⼊侵发⽣时实现快速检测

  • 处理速度和可扩展性:解决⽅案的速度和可扩展性⾄关重要,直接影响⽤户体验和安全防护效果

个性化

  • 发现服务器(Discord Server,类似兴趣组):帮助⽤户快速发现感兴趣的新服务器

  • 通知优化:实时确定最佳通知内容和发送时机,确保信息时效性

  • 响应速度:需要在⼏分钟内完成相关计算,避免内容过时失效

2.2 痛点

  • 规则引擎不适合ML: 专为人工规则设计,无法处理历史数据,基础计算困难,导致新特征上线延迟长达一个月。

  • 批处理延迟高、整合难: 数据获取的延迟依赖批处理的效率,手动拼接批处理与实时特征易错难调,模型问题诊断困难。

  • 微服务臃肿低效: 每个模型独立部署微服务带来高复杂度与部署负担,响应速度跟不上威胁变化,灵活性牺牲了实时性。

3. 解决方案

Discord 采用了基于 Pulsar、Flink 和 Iceberg 的实时流处理方案。其中,从 Google Cloud Pub/Sub(GCP) 迁移到 Pulsar 是一个关键决策,显著提升了效率和可扩展性。Flink 和 Iceberg 则在分析实时数据、管理历史事件以及回填(backfill)方面发挥了至关重要的作用。

“对我们而言,Pulsar 的关键优势在于它不仅拥有队列传输模式(这在 Discord 非常常用),还提供了分区式传输模式。”
“Pulsar 分区传输在保障顺序性的同时,还能实现极低的延迟 ;我们利用这一点实现了近乎即时的水位线(watermark)体验,并在低延迟的情况下获得了准确的结果。”

GCP 提供了一种无状态且无序的内部事件流量托管方案,适用于不关⼼时间顺序的宽泛分发队列、大规模并⾏处理的⽆状态任务,但存在以下问题:

  • Connector:Flink-PubSub 连接器维护不⾜且过时;需要依赖开源 PR 才能实现统⼀批流 API

  • 高延迟:高达20-40s的延迟

  • 高成本:随着规模扩大成本明显拉高

在这种场景下,Pulsar 凭借丰富的 Connector 支持、分区和队列双模式、存算分离、原生多租户支持及优秀的低延迟表现从众多方案中脱颖而出。

基于业务需求,Discord 的工程师团队构建了一个成熟精简、高效灵活且突破传统限制的生产级架构,Pulsar 在其中扮演了实时数据主干网流批融合关键枢纽的角色。

  • 精简架构与生产就绪的 ML 生态系统:该方案显著简化了架构,减少了部署组件。工程师无需关注底层数据来源的复杂性,系统自动处理数据分区和可靠交付。利用 Flink 作业进行实时的特征计算(过滤、聚合、连接等),并将长期运行(数月)的计算结果直接输出到 Iceberg 表中,作为高质量的训练数据集。模型部署采用ONNX格式,兼容XGBoost、PyTorch、TensorFlow等主流框架,其二进制文件可直接嵌入Flink作业运行,完全摒弃了传统独立的模型服务,这不仅大幅降低了系统复杂度和潜在错误,也使得开发调试更简单快速,显著提升了开发效率。

  • 灵活流处理与混合源能力: 系统的关键创新在于利用 Flink 的HybridSource技术,无缝融合了批处理源(Iceberg)和流处理源(Pulsar)。Pulsar 作为核心的实时数据流来源,与 Iceberg 的历史数据结合得天衣无缝。系统能够在预定时间戳自动在批处理和流处理源之间透明切换,这对工程师完全隐藏了底层复杂性。这种设计确保了开发环境与生产环境数据源的高度一致性,工程师可以直接使用 Pulsar 流和 Iceberg 表进行开发测试,并支持从历史任意时间点(数月甚至一年前)启动作业,进行回填或调试。即使在处理海量数据时,基于 Pulsar 提供的稳定实时流和 Iceberg 的可靠存储,系统也表现出极强的稳定性和增量处理能力。

  • 突破实时状态与回填限制:该架构彻底解决了实时 ML 系统常见的状态管理和历史数据回填难题。得益于流批一体的设计(核心是 Pulsar 流与 Iceberg 表的融合)和模型内嵌于 Flink 作业的简化架构(模型仅是作业中的一个“小方块”),系统发生变更后,历史数据的回填速度极快,仅需 3-4 小时即可完成。这使得快速训练新模型并部署上线观察效果成为现实,极大加速了模型迭代周期。运维层面,通过自定义 Bazel 规则简化了 ML 工程师的工作流,并利用 Flink Kubernetes Operator自动化管理作业的完整生命周期(包括部署、保存点、高可用性),确保了系统的稳健运行。Pulsar 提供的持久化、可重放实时流,是支撑快速、稳定回填的关键基础设施之一。

  • 关键安全指标提升与广泛适用性:此系统在 Discord 最核心的安全场景(如垃圾邮件过滤和账户保护)中实现了两位数的关键指标提升,并成功将平台超过 60% 的安全评分决策从传统启发式规则迁移至实时 ML 模型驱动。这得益于 Pulsar 提供的高吞吐、低延迟实时数据流,使得系统能够在虚假账户和僵尸网络发起攻击、造成实际损害前就进行主动检测与拦截,显著增强了平台的实时防御能力。更重要的是,该架构设计具备高度通用性,其基于成熟开源技术栈(Pulsar、Flink、Iceberg)的精简模型和流批一体能力,使其可轻松扩展应用于 A/B 测试、用户实验、个性化推荐等多个场景。

4. 结语

Discord 的成功实践充分验证了由 Pulsar、Flink 和 Iceberg 构建的实时机器学习平台的高效性与强大潜力。利用 Pulsar 作为高吞吐、低延迟的实时数据主干网,无缝连接流处理与批处理,为 Flink 的实时特征计算和模型嵌入提供了坚实基础。

David Christle 的分享不仅展示了这一技术栈(尤其是 Pulsar 在流批融合中的关键作用)的强大实力,更凸显了小型团队基于成熟开源技术打造精简、高效生产系统的卓越能力。该案例也为业界探索实时机器学习融合、构建以可靠消息流(如 Pulsar)为核心的实时数据管道提供了极具参考价值的范本。

公众号后台发送“Discord”获取完整演讲视频

图片

Apache Pulsar 作为一个高性能、分布式的发布-订阅消息系统,正在全球范围内获得越来越多的关注和应用。如果你对分布式系统、消息队列或流处理感兴趣,欢迎加入我们!

Github: 

https://github.com/apache/pulsar

图片

扫码添加pulsarbot,加入Pulsar社区交流群

最佳实践

互联网

腾讯BiFang | 腾讯云 | 微信 | 腾讯 | BIGO | 360 | 滴滴  | 腾讯互娱 | 腾讯游戏 | vivo | 科大讯飞 | 新浪微博 | 金山云 | STICORP | 雅虎日本 | Nutanix Beam | 智联招聘 

金融/计费

腾讯计费 | 平安证券 | 拉卡拉 | Qraft | 甜橙金融 

电商

Flipkart | 谊品生鲜 | Narvar | Iterable 

机器学习

腾讯Angel PowerFL

物联网

云兴科技智慧城市 | 科拓停车 | 华为云 | 清华大学能源互联网创新研究院 | 涂鸦智能

通信

江苏移动 | 移动云 

教育

网易有道 | 传智教育

推荐阅读

免费可视化集群管控 | 资料合集 | 实现原理 | BookKeeper储存架构解析 | Pulsar运维 | MQ设计精要 | Pulsar vs Kafka | 从RabbitMQ 到 Pulsar | 内存使用原理 | 从Kafka到Pulsar | 跨地域复制 | Spring + Pulsar | Doris + Pulsar | SpringBoot + Pulsar 

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93398.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构入门】二叉树(2)

目录 1.二叉树遍历顺序 1.1 前序(先根)遍历 1.2 中序(中根)遍历 1.3 后序(后根)遍历 1.4 层序遍历 1.5 深度优先遍历&广度优先遍历 2.二叉树的遍历 2.1 前根遍历(递归) …

【电机参数】电压、电流、转速标幺化推算过程

【电机参数】电压、电流、转速标幺化推算过程 文章目录[TOC](文章目录)前言一、标幺化目的——优化计算二、Q15与标幺化的关系三、标幺值计算1.电压标幺值2.电流标幺值3.转速标幺值四、参考资料总结前言 一、标幺化目的——优化计算 不同物理量的量纲和数值范围差异巨大&#…

v-scale-scree: 根据屏幕尺寸缩放内容

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…

linux设备驱动之字符设备驱动

一、cdev结构体‌成员/功能‌‌说明‌‌相关操作函数/宏‌‌kobj‌内嵌的kobject对象,用于Linux设备模型管理,实现引用计数和sysfs接口kobject_init()‌owner‌指向拥有该结构体的模块指针(通常为THIS_MODULE),防止模块…

★CentOS:MySQL数据备份

一、cp 命令备份特点:优点:备份恢复数据快:直接复制文件,无需进行数据转换和复杂的处理,因此备份恢复速度非常快缺点:需要停止数据库服务,灵活性差,占用空间大,可移植性差…

Python代码规范与静态检查(ruff/black/mypy + pyproject.toml + Makefile)自动化工具链介绍

文章目录**1. 核心工具的作用****(1) black:代码格式化工具****(2) ruff:代码质量检查工具****(3) mypy:静态类型检查工具****2. pyproject.toml:统一配置中心****示例配置**(pyproject.toml):*…

软件需求管理过程详解

需求管理过程需求管理是软件工程和系统开发中的核心过程,它确保项目始终围绕正确、稳定且可追溯的需求进行。在复杂系统开发中,需求往往动态变化,需求管理通过系统化的方法控制变更、维护版本、建立追溯关系,从而降低项目风险、保…

MySQL性能优化实战指南:从入门到精通的完整优化体系

MySQL性能优化实战指南:从入门到精通的完整优化体系🚀 前言:在当今数据驱动的时代,MySQL作为世界上最流行的开源关系型数据库,其性能优化能力直接决定了应用系统的响应速度和用户体验。本文将从多个维度深入探讨MySQL优…

KingbaseES主备读写分离集群安装教程

首先我们先要找数据库集群安装软件和脚本。这里我事先安装一台单机。 [rootlocalhost zip]# mkdir -p /home/kingbase/software [rootlocalhost zip]# scp -r * /home/kingbase/software/ #安装软件和脚本在单机版本的/opt/Kingbase/ES/V9/ClientTools/guitools/DeployTools/z…

electron程序适配loongArch64

一、原始项目 1.原始程序适配arm,x86国产linux设备;新增需求适配loongArch64麒麟v10sp1。 2.原始devDependencies "devDependencies": {"electron": "^17.2.0","electron-builder": "^23.0.3",}二、可能遇到的问…

窗口系统(windowing system)的架构思考

我想做一个通用窗口系统,窗口、控件等,一切都抽象成树形结构的层叠矩形块,可支持半透明、模糊等混合选项,那么每个窗口是不是需要一块存储区?我之前的代码为了计算模糊,还不止一块,要三块。那么…

极简工具箱:安卓工具箱合集

软件介绍 极简工具箱是一个安卓工具箱合集软件;软件支持安卓。 它支持将近 400 个实用功能,支持将近 40 款单机游戏,提供 140 多个实用网站导航,包括电子书导航、学习导航、设计导航、产品经理导航、大数据导航、文档格式转换、…

TOGAF八步一法笔记2

业务需求和验收标准一旦方向确定,接下来的关键就是:创建业务需求、明确验收标准当“预备阶段”完成,能力愿景和范围被管理层确认后,我们正式进入能力建设的“实施轨道”。而这个轨道的起点,是两个核心动作:…

各种读取csv文件的工具性能比较

在翻阅calamine作者的quick-csv存储库时无意中看到有个10年前的csv读取比赛, 把比赛选手源程序下载下来测试看到底有多快。 git clone https://bitbucket.org/ewanhiggs/csv-game.git这些源程序只有比赛程序本身,依赖的文件有的在主页,有的在makefile中…

HTML <iframe> 标签 如何把html写入iframe标签

标签 如何把html写入iframe标签 使用srcdoc属性 HTML iframe 标签 参考 定义和用法 <iframe> 标签定义行内框架&#xff08;内联框架&#xff09;。 行内框架用于在当前 HTML 文档中嵌入另一个文档。

Java Spark例子程序

目录spark基础&rdddocsRDDspark架构Spark 对比 hadoop MapReducespark maven依赖Spark的checkpointtransformations、shuffle、actionsreduceByKey的用法groupByKey的用法count / count distinct例子&#xff1a;单词计数例子&#xff1a;一批人员年龄数据求平均(rdd)例子&…

《代码重生:杨蓉与62.webp》

《代码重生&#xff1a;杨蓉与62.webp》2045年&#xff0c;星耀城。雨丝斜织在量子玻璃幕墙上&#xff0c;霓虹倒影如液态代码流淌。杨蓉坐在“时光回溯实验室”的终端前&#xff0c;面前悬浮着一行行泛黄的日志——那是从2018年GitHub快照中提取的原始构建记录。她指尖轻点&am…

软考 系统架构设计师系列知识点之杂项集萃(123)

接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(122) 第227题 某公司欲开发一种工业机器人,用来进行汽车零件的装配。公司的架构师经过分析与讨论,给出了该机器人控制软件的两种候选架构方案:闭环控制和分层结构。以下对于这两者候选框架的选择路由,错误的是(…

Sonatype Nexus Repository Manager docker版本安装

docker 网址 https://hub.docker.com/r/sonatype/nexus3 拉取镜像 docker pull sonatype/nexus3创建docker docker run -d -p 8081:8081 --name nexus --restart always sonatype/nexus3查看密码 docker exec nexus cat /nexus-data/admin.password导出docker image 镜像 …

Java Stream API:让业务数据处理更优雅

在 Java 业务开发中&#xff0c;我们经常需要对集合数据进行**筛选&#xff08;filter&#xff09;、转换&#xff08;map&#xff09;、聚合&#xff08;collect&#xff09;**等操作。比如从一批结果中过滤出符合条件的记录&#xff0c;就像这样&#xff1a; 假数据&#xf…