Flink CEP 在抖音电商的业务实践

news2025/5/29 6:48:37

摘要:本文整理自抖音电商实时数仓研发工程师张健,在 FFA 实时风控专场的分享。本篇内容主要分为四个部分:

  1. Flink CEP 简介

  2. 业务场景与挑战

  3. 解决方案实践

  4. 未来展望

Tips:点击「阅读原文」查看原文视频&演讲 ppt

01

Flink CEP 简介

73c76ca9b7caaafd054e75305fcd6f23.jpeg

Flink CEP 是基于 Flink Runtime 构建的复杂事件处理库,它擅长处理跨多个事件的复杂规则匹配场景。例如检测用户下单后,是否超过半个小时没有发生支付行为;检测用户进入直播间后,是否有浏览商品随后加入购物车行为。

Flink CEP 有以下优势:

  • 支持跨多事件的规则匹配计算;

  • 支持精准一次计算语义;

  • 低延迟、高吞吐等特性。


02

业务场景与挑战

随着抖音电商业务逐渐趋于稳定和成熟,抖音电商实时数仓团队接到的实时数据规则类业务需求也逐步增多,因此我们开始尝试使用 Flink CEP 来支持这些业务场景。

下面列举两个典型的业务场景,并介绍一下 Flink CEP 在这些场景中遇到的一些挑战。


2.1 业务背景

afbfab7f70eba9e59cc5069d80173c46.jpeg

第一是实时预警场景,它是非常典型的业务诉求,把用户看数据的方式从大屏“盯盘”转换为“根据规则检测结果,主动推送”,这无疑对一些关键业务问题的发现和洞察起到至关重要的作用。有如下三个具体案例:

  • 直播实时检测场景。当检测到 10 分钟内观看人数持续下跌的直播间时,实时把消息推送给直播达人,方便其及时做出直播策略的调整。比如调整讲解商品的话术,发放粉丝礼物等等,进而提升转化。

  • 实时风控的场景。当检测到有用户 30 分钟内创建了多笔订单,均未支付的情况,这个用户大概率是一个刷单用户。我们会将这个用户实时推送给平台治理同学,并做出相应的封禁处置,促进平台的整体生态健康。

  • 售后咨询场景。当检测到一个用户发起咨询后,超过 30 分钟都未得到回复,会立即通知相关的客服人员及时回复,提升整体的用户体验。

第二是实施营销场景,它是基于实时数据驱动,根据定义的规则策略挖掘目标群体,并根据业务目标做出精准营销投放的营销活动。有如下三个具体案例:

  • 实时发券场景。针对一些价格比较高的商品,当检测到用户下单后超过 30 分钟没有支付,那么该用户很有可能是觉得价格太高,所以一直犹豫要不要支付。这个时候可以及时给这个用户发放一些优惠券刺激购买,从而提升平台的转化率。

  • 帮助商家及时发现爆款商品场景。当检测到某款商品在五分钟内成交超过 1000 单时,会实时将这个商品的名称、品牌、库存等信息推送给商家,以便商家及时补货、直播间挂链接等行为,提升运营效率。

  • 在线发奖励场景。当检测到一个达人在完成电商大学学习后,一天内进行了电商开播或者发布了电商短视频等行为,就会对这个达人发放抖 dou+券等仪式奖励,提升整体达人的入驻率,进而给商家提升更加多元的达人选择。


2.2 业务挑战

7cc29e4336009ab5a5c80592f07d62f1.jpeg

第一,在规则配置方面存在灵活性不足的问题。当前无论是新增还是修改规则,都需要实时数仓的研发同学通过修改代码的方式来支持,这就导致研发同学需要频繁的对接业务。在一些极端的场景,比如双十一大促期间,一个研发同学往往需要同时应对接,二十多个运营同学的规则创建或者修改的诉求。业务需求也由于人力的单点阻塞问题迟迟无法上线。

第二,规则与计算任务之间存在深度耦合。当每个规则都需要强制绑定一个计算任务时,就会导致计算任务的数量会随着规则的创建逐渐增多。大量的任务会造成极高的运维成本和巨大的资源浪费,使整个系统最终变得不可维护。以前面提到的商家自定义规则检测爆款商品的这个场景为例,考虑到当前抖音电商庞大的商家群体,最终创建规则的数量可能是巨大的,进而导致整个计算任务的数量也随之爆炸。

第三,当前 Flink CEP 支持的规则语义不够丰富。列举两个典型的案例:

  • 第一个案例,假设我们需要检测用户多次下单后,没有在一小时内完成支付行为。这种场景的特点是用户最后一次下单后,一直没有支付事件来触发这个规则完成匹配。当前 Flink CEP 不支持这种场景,但在真实的业务中这又是非常普遍的规则诉求。

  • 第二个案例,假设我们需要检测用户在过去一小时内,是否完成浏览商品、加入购物车、下单行为。注意这里要求的三种行为不分先后顺序,只要在规定的时间内完成以上三种行为即可。这种场景当前 Flink CEP 也不支持。


03

解决方案实践

494b21104d1f46e4737c16c235500137.jpeg

整体我们分为四个阶段来解决上述的问题。

第一阶段,我们对 Flink CEP 规则的核心信息进行了提炼和抽象,并设计了一套清晰易懂的规则 DSL。这样就可以让业务同学自主配置业务规则,从而解决规则配置灵活性不足的问题。那么如何让业务配置的规则运行起来?

第二阶段,我们对 Flink CEP 计算任务进行改造,让其支持动态提交规则或者更新规则的能力,从而实现规则与计算任务之间的彻底解耦。解耦之后,不再强制要求每一个规则必须对应一个计算任务来运行。也就是同一个计算任务可以同时接收提交的多条规则,实现收敛整体计算任务的数量,提升规则利用率的目标。

前面两个阶段要解决了规则配置的灵活性以及规则与其他任务的强绑定问题,但是仍然没有解决规则本身的语义丰富性问题。因此,第三阶段,我们主要针对特定业务的场景的规则诉求、升级和拓展规则的语义。

经过前三阶段的升级和优化,前面提到的业务痛点已经基本得到了解决,但规则引擎在易用性和周边能力方面还有所欠缺。例如我们无法直观的查看当前系统运行的规则内容、注册事件数据;业务提交的规则与计算任务之间根据什么样的策略来进行分发;用户仍然需要订阅规则引擎的输出数据进行格式转换、写入目标存储等操作。

因此在第四阶段,我们整合了前面的方案,并不断丰富周边能力生态,打造了一站式实时规则平台。支持用户在平台上进行事件注册、预览、规则配置、规则调试、规则发布等全流程的自主操作,进一步提升工作效率。

cd2d8ee65fd8e0fa7202e042b98d238e.jpeg

为了实现业务自主配置规则,规则的语法必须清晰易懂。我们设计规则 DSL 整体结合了 JSON 和基础 SQL 语法,利用 JSON 的高可读性来描述规则的元数据、规则匹配属性等信息,利用 SQL 的强大表达力来描述 CEP 匹配条件以及匹配结果的处理逻辑。

8684935843a7f1ca7d728117fff67907.jpeg

这里我们发现了一个新的问题,如何通过 SQL 来表达事件是否满足匹配条件?SQL 可以查询哪些表?以一个具体的案例来回答这个问题。

假设要检测用户下单后是否发生了支付行为,那么规则编译生成的 NFA 可能是上图所示的样子。在规则运行时,我们将当前流入的事件以及当前规则的中间匹配结果,都以数据表的形式注册到上下文。当前流入的事件对应的表名称默认是 events,规则中间匹配结果对应的表名称和它的 PatternName 保持一致。

在这个案例中,每个 SQL 可查询到的表就是三张,分别是 events 表,表示当前流入的事件;create_order 表,表示当前已经匹配到的下单事件;pay_order 表,表示已经匹配到的支付事件。

在配置 SQL 时,就可以对已经注册到上下文的任意数据表进行查询。当 SQL 查询的结果非空时,就表示当前匹配条件判断通过。状态机经过 Take 边流转到下一个状态,并将事件保存到对应的表,否则就会到 Ignore 边,丢弃掉事件。

b44f229a82afb987adbc896686b6fbb0.jpeg

再来看一下这个案例对应的规则配置条件的完整配置。整体是一个数组的形式,数组中每个元素表示一个 pattern,第二个 pattern 与前一个 pattern 之间的连接类型是 FOLLOWED_BY。第一个 pattern 的匹配条件是从流中检测用户下单事件,第二个 pattern 匹配条件是从流入检测用户支付事件。

注意,这个支付事件的订单是上一步我们缓存下来的下单事件对应的那个订单。经过上面的改造实现了,只要稍微有一些 SQL 基础的业务人员,都可以看懂并配置规则。

b1b62661397730c7c27a447f4d0c7f9f.jpeg

前面我们提到,当前的 Flink CEP 计算任务不支持动态提交规则。主要原因是在编译阶段 Flink CEP 规则计算逻辑就确定了,并且已经通过 NFACompiler 编译完毕。在运行时计算任务只能固定执行之前已经编译好的规则。那么我们是如何改造的呢?

bced0cd220537bf6f9c370d067e1e475.jpeg

为了实现规则的动态发现,我们引入了一个规则流,用户提交或修改的规则都可以发到这条流中。为了实现规则的动态注入,我们将规则流设计为 Broadcast Stream。当发现新提交的规则时,广播分发到所有的 SubTask。

为了实现规则的在线加载执行,我们基于前面提到的规则 DSL,研发了一套基于规则的解析器。当 SubTask 收到分发的规则后,可以在线解析生成规则运行需要的组件。例如 NFA、规则匹配条件 SQL 对应的执行计划、匹配结果处理函数等。然后保存到 Flink State 中,持续检测和处理后续的事件。

解释一下为什么采用 Broadcast Stream 来实现规则的动态注入。由于 Flink CEP 是有状态的计算,规则的更新/删除往往需要伴随 Flink States 的操作和处理。例如:当删除规则时,连带当前规则关联的事件缓存等状态信息也需要一并删除。对比通过其他方式感知规则变更,比如启动一个异步线程定时扫描规则,通过 Broadcast Stream 的方式优势是,当检测到规则变更,能够更方便安全的操作 Flink State。

上面的方案解决了一个计算任务动态提交规则的诉求,但当一个计算任务运行多条规则时,又带来了一个新的问题。

问题一,由于规则的事件分组逻辑可能不同。(比如规则 A 需要先对事件流按照"用户的 IP 地址"路由到同一 Task 后再进行 NFA 匹配计算。而规则 B 则需要对事件流按”用户的设备 ID“进行路由)。那么当这两个规则运行在同一个计算任务时,如何兼容呢?

为了解决这个问题,我们新增了 KeyGenOperator 算子。当检测到新的事件流入时,先根据每一条规则配置生成一个与之对应分组的 Key,然后按分组 Key 再进行下游的 Task 分发,这样就实现了对多条规则的不同事件分组逻辑的兼容。

问题二,由于同一个计算任务运行多条规则,就可能会带来规则计算冗余的问题。比如,规则 A 关注用户下单、支付等支付相关事件,而规则 B 关注用户的商品浏览、评论等流量相关的事件。如果同一个计算任务同时运行这两条规则,那么这个任务就必须同时消费这两类事件。也就是说规则 A 本不关注流量类的事件,但由于整个任务整体订阅了这类事件,就导致规则 A 也必须处理这类事件。

为了解决上述问题,我们在 KeyGenOperator 算子新增了“事件筛选”组件,实现针对同一输入事件不同规则里的个性化事件筛选。也就是说,针对新流入的事件,仅当规则关注这个事件的时候,才会生成与之对应的分组 Key,并且进行后续的计算。

值得一提的是:在商家自定义预警的业务场景中,由于事件筛选的效果是比较好的(也就是说,商家自定义的每个规则仅关注当前商家所属商品的相关事件),那么经过我们测试,单个任务(在 600Core、800 并发度的情况下)可以支持的商家简单规则数量可以超过百万。

78da6dc98bb6edb7bd63128f037af5fe.jpeg

当发生事件 A 后一段时间内,没有发生事件 B,其对应的伪代码可能是上面的这种形式。当前的 Flink CEP 不支持这种语义,因为可能造成没有事件触发这条规则,最终完成匹配的情况。

1ce064a9dd07d22059a9351ed72defab.jpeg

针对这个问题,我们在规则生成的 NFA 中引入一种 Pending 状态。当流入事件满足创建订单的条件之后,状态会随之迁移到 Pending 状态等待超时。当 Flink CEP 任务的 watermark 向前推进时,会触发 Pending 状态的 NFC 进行计算,判断是否已经超时,如果超时就会触发 NFA,迁移到下一个 Final 状态。如果在这之前系统流入了订单支付事件,就会转移到 Stop 状态。

通过这种方式,我们实现了对发生事件 A 之后一段时间内,没有发生事件 B 类的语义的支持。

42bb6d69137066281668a7e91703d589.jpeg

为了进一步提升规则引擎的应用性,我们整合前面的方案,拓展规则引擎的周边能力,研发了一站式规则平台。用户可以在平台上自助进行事件的注册、预览、规则配置、调试、发布等全流程的自助操作。

平台整个架构共分为四层,分别是:

事件层,例如看播事件、下单事件、物流事件、客服事件等。

计算层,负责动态的接收用户提交的 CEP 规则,并对规则进行解析,检测后续流入事件。计算层的核心是规则计算模块,也就是具体的 Flink CEP 计算任务。同时在计算层还有规则调度模块和规则解析模块,规则调度模块负责将新提交的规则分发到具体的 Flink CEP 计算任务,调度策略可以选择同事件源优先或者负载均衡优先。

  • 同事件源优先是将关注相同 topic 的事件的规则,调动到同一个 Flink CEP 计算任务。例如将关注看播事件的规则调度到一个计算任务中,而将关注物流事件的规则调度到另一个计算任务中。负载均衡优先则是根据 Flink CEP 计算任务当前的负载情况,尽量将新提交的规则调度到相对空闲的计算任务执行。

  • 规则解析模块负责当集团任务收到规则之后,解析并编译规则,生成规则运行时的组件。例如前面提到的 NFA、规则匹配条件对应的 SQL 执行计划等等。

触达层,负责计算层规则匹配结果的数据应用,主要包括延迟策略管理、维度字段扩充、推送目标管理等。

  • 延迟策略管理主要负责当目标完成匹配后,是否立即进入下一个动作。例如,当用户完成既定的行为动作之后,可以选择立即发放优惠券,或者等待五分钟之后再发放优惠券。

  • 维度字段扩充主要负责当目标完成匹配后,为数据补充相关的维度字段。例如,当用户完成浏览、下单、支付行为后,我们可以根据平台的配置,拼接补充订单关联的商品信息。例如商品的名称、价格等,供用户最终更好的决策。

  • 推送目标管理主要负责当目标完成匹配后,具体需要执行的动作。例如当检测到用户有可能存在刷单行为时,给平台治理同学推送飞书消息。

平台层,负责与用户交互以及任务运维等工作。

acbca3443b5be15d4bc84ab9ca488b7c.jpeg

业务成效方面:

  • 业务自主配置规则,提升需求支持灵活性。目前共创建各类实时规则 2.5w+,服务平台运营同学 100+。

  • 规则与计算任务解耦,无需研发介入即可支持规则创建/变更。业务规则需求支持平均耗时由 1day 缩减至 1hour。

  • 提升 CEP 规则语义丰富度。规则引擎能力实现了抖音电商 70%+ 业务场景的覆盖。

技术成效方面:

  • 由 Case By Case 的点状需求支持模式向面向平台的例行迭代转变,避免了单点人力阻塞问题,提升整体代码健壮性。

  • 整体计算任务数量得到收敛,当前总体任务数量≤50,月均计算任务治理运维相关工作量降低50%+。

  • 降低计算任务整体资源浪费,单任务平均资源利用率提升 50%+。


04

未来展望

未来我们计划在以下三个方面继续对规则引擎进行建设。

  • 第一,继续打磨实时规则平台周边生态能力,实现更丰富、灵活的事件接入、触达方式。

  • 第二,探索规则计算流批一体,打破离线、实时事件之间的壁垒,拓展平台应用范围。

  • 第三,打通公司大数据研发环境,实现更加便捷的计算任务操作,进一步降低人工成本。

往期精选

b4b4b582b956bb48fdb466a948c7b13f.png

0a433775b8ba6010d1faff9df9c19a9f.jpeg

581fff3ace040ef725c1087975e743e5.jpeg

88841d4280273d236c1aafdeb306b987.jpeg

8d9f9da967eb40c4390b050477c2774d.jpeg

▼ 关注「Apache Flink」,获取更多技术干货 ▼

f456dfc4a0b322d15b4eb47044e66f42.png

 7e997bcfdb445bb041bc4fccec8d0a4b.gif  点击「阅读原文」,查看原文视频&演讲 PPT

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

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

相关文章

论文投稿指南——中文核心期刊推荐(冶金工业 2)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…

23种设计模式之策略模式

一、概念 就是将一系列算法封装起来,并使它们之间相互替换。被封装起来的算法具有独立性外部不可改变其特性。 策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算…

BCN点击试剂diSulfo-Cy5-PEG3-BCN,二磺酸三聚乙二醇环丙烷环辛炔,纯度 95%+

【中文名称】二磺酸-三聚乙二醇-环丙烷环辛炔【英文名称】 diSulfo-Cy5-PEG3-BCN,BCN-PEG-Sulfo Cy5【CAS号】N/A【分子式】C51H68N4O12S2【分子量】993.24【基团】BCN基团【纯度】95%【规格标准】1g,5g,10g,包装灵活,…

2-ChatGPT插件到Google浏览器,并进行ChatGPT工作。

ChatGPT插件到Google浏览器,并进行ChatGPT工作。1,首先,在装插件ChatGPT forGoogle插件时,我没安装成功,问题是我没有区分Google浏览器和双核浏览器的差别。2,如何使用ChatGPT在浏览器上进行工作。1&#x…

[future 2022] 基于特征选择的DDoS攻击流分类方法

https://www.sciencedirect.com/science/article/pii/S0167739X22000474highlights•我们设计了一种特征选择方法来选择独立和相关的特征。•我们设计了一种方法来识别物联网和复杂的 DDoS 攻击流。•该体系结构在有效性和效率方面优于比较方法。摘要分布式拒绝服务 (DDoS) 攻击…

CentOS8基础篇3:使用vim编辑文档

一、vim编辑器 vim 编辑器共有三种工作模式,分别是命令模式、输入模式和末行模式。 〖例2.24〗使用vim编辑器创建并编辑文件hello.c。 二、查看文件内容命令 1. more/less 浏览文件全部内容 当文件内容过多时,可以用more或less命令来查看。 命令格式…

HTTP缓存看这一篇就够了

前言 HTTP缓存机制是优化web性能的重要手段,也是优化用户体验的重要一环。了解和熟悉HTTP缓存机制也成为了前端工作者必不可少的技能。 HTTP缓存是用于临时存储网页资源(如HTML页面、图像等),以减少服务器延迟的一种技术。HTTP缓…

nim语言在不同操作系统安装

官网: Nim Programming Language 学习文档: Nim文档概述 Tutorial (part I)The Nim one deals with basics. 官方下载地址:Download - Nim Programming Language 目录 Mac OS Ubuntu centos Mac OS 安装语言 brew install nim 安装…

nodejs基于vue的饭店点餐外卖平台网站

本系统主要实现了管理员:首页、个人中心、用户管理、菜品分类管理、菜品信息管理、菜品评价管理、系统管理、订单管理,用户:首页、个人中心、菜品评价管理、我的收藏管理、订单管理,前台首页:首页、菜品信息、菜品资讯、个人中心、后台管理、…

尚医通(九)数据字典模块前后端 | EasyExcel

目录一、数据字典介绍1、什么是数据字典2、页面展示效果3、数据字典表设计4、数据分析5、根据页面效果分析数据接口二、搭建数据字典模块三、数据字典列表接口1、model模块添加数据字典实体2、添加数据字典mapper3、添加数据字典service4、添加数据字典controller四、数据字典列…

【百宝书】ChatGPT真的会成为MOSS吗?如果MOSS真的存在,地球和人类的结局会是怎么样的。

大家好,我是涵子,今天我们紧随潮流,聊聊ChatGPT会成为MOSS吗?如果MOSS真的存在,地球和人类的结局会是怎么样的。 本次借鉴内容: 程序yang - ChatGPT的火爆出圈,你对它有几分了解?_程…

【C++提高编程】map/ multimap 容器详解(附测试用例与结果图)

目录1. map/ multimap容器1.1 map基本概念1.2 map构造和赋值1.3 map大小和交换1.4 map插入和删除1.5 map查找和统计1.6 map容器排序1.7 案例-员工分组1.7.1 案例描述1.7.2 实现步骤1. map/ multimap容器 1.1 map基本概念 简介: map中所有元素都是pairpair中第一个…

“亚洲一号”也能上市?REITs背后的物流设施风起云涌

京东最近发生了两件大事,两件都与物流基础设施有关。 一件是2月8日,嘉实京东仓储物流封闭式基础设施证券投资基金(简称“京东仓储REIT”)正式登陆上交所,投资者获得了机会,去分享京东三处物流园区的收益&a…

数据治理专业认证CDMP学习笔记(思维导图与知识点)- 第五章数据建模与设计篇...

大家好,我是独孤风,一位曾经的港口煤炭工人,目前在某国企任大数据负责人,公众号大数据流动主理人。在最近的两年的时间里,因为公司的需求,还有大数据的发展趋势所在,我开始学习数据治理的相关知…

分布式新闻项目实战 - 9.后台系统管理

佳能:感动常在 记得很早之前看过的一个广告:男子拿着妻子的相机发呆,父亲尝试安慰着他,然后接过相机给他拍了张照片,突然他进去了相机的世界,相机里的他一直给父亲做手势,直到父亲翻到了最后一张…

MySQL数据库02——SQL基本语言组成和数据类型

接着上一章的内容,上一章安装好了Mysql和对应的编译器workbench,并且简单的创造了一个数据库college,这一章我们学习SQL语言的一些基础。 首先了解一下基础。 Sql语言组成 sql 的一些基本定义语句的的用法。 操作对象 语句 功能 表 CRE…

leetcode 困难 —— N 皇后(简单递归)

(不知道为啥总是给这种简单的递归设为困难题,虽然优化部分很不错,但是题目太好过了) 题目: 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个…

2023年信息与通信工程国际会议(JCICE 2023)

2023年信息与通信工程国际会议(JCICE 2023) 重要信息 会议网址:www.jcice.org 会议时间:2023年3月17-19日 召开地点:成都 截稿时间:2023年2月10日 录用通知:投稿后2周内 收录检索:EI,Scopus 会议简介…

干货 | 机器人的运动规划方法和应用现状

“如今,机器人正在更深入的服务于人类,它们要想完成的一些力所能及的操作,都需要依托于机器人的运动规划。本期技术干货,我们邀请到了小米工程师——‍孙国康,向我们介绍机器人的运动规划方法和应用现状。”一、前言近…

C++ 浅谈之 STL Deque

C 浅谈之 STL Deque HELLO,各位博友好,我是阿呆 🙈🙈🙈 这里是 C 浅谈系列,收录在专栏 C 语言中 😜😜😜 本系列阿呆将记录一些 C 语言重要的语法特性 🏃&a…