如何在端外投放的场景下实现前端实时CEP框架?

简介: 一个实时、动态、多容器的前端CEP设计

作者:闲鱼技术-玉缜

背景

复杂事件处理(Complex Event Processing,以下简称CEP)在闲鱼内得到了广泛应用,基于用户使用闲鱼的实时行为,为用户提供更加丰富的优质信息与服务。闲鱼技术公众号有介绍过CEP在服务端和客户端上的设计与实现。然而之前的设计方案都只适用于闲鱼App端内场景,针对端外投放拉新场景(例如用户访问了多个商品详情页之后给用户发放优惠引导用户下单)需要设计在纯前端环境执行的实时CEP框架。本文主要介绍了在前端实现CEP的相关设计与实现。

设计目标

整个流程可以抽象为用户实时行为按照一系列规则匹配之后,以前台UI的方式对用户进行触达干预。对外投业务场景进行抽象,除了CEP基础能力之外,还有这三点关键设计目标:

  1. 触达实时:从用户相关行为操作到对用户进行触达干预要尽量快,如果整个流程不够快,在触达干预的时候用户可能已经流失了。
  2. 策略动态:业务需要经常对线上策略进行调整,期望业务开发只需要做一次接入,后续策略都可以服务端动态下发。
  3. 多容器:外投场景包括小程序/Web/Weex这几种容器场景,都需要支持。

架构设计

将业务流程拆解为三部分,分别是用户实时行为采集、对实时行为按照规则复杂计算、以前端UI组件进行用户触达,对应三个核心模块:事件采集、复杂计算和用户触达。针对上述设计目标,为了实现触达实时,将对行为的复杂计算放到前端去执行;为了实现策略动态,设计了一个服务端运营平台管理所有策略,采集行为信息、复杂计算规则、触达组件信息都从服务端获取;为了实现多容器,将实时行为采集和UI组件触达进行标准设计,分不同容器环境实现。此外由于策略会存在跨页面的场景,底层会有数据同步模块同步行为数据和计算状态。下面分别对重要模块进行详细介绍。
|center

事件采集

事件采集模块将用户行为转化为标准事件。首先是用户行为无侵入采集,无侵入采集是为了解决两个问题,第一个是为了让业务开发接入更加简单,不需要手动调用采集代码;第二个是为了覆盖更多可能的采集点,利于后续策略动态下发。这里我们选用静态扫描代码的方式,在具有特定行为标示(例如onClick)的元素节点上注入采集参数,采集参数通过元素样式名称、组件名称、文件路径等信息生成,具有比较好的语义;并且和运行时无关,更利于扩展不同容器实现。
|center|321x400
初期先定义了用户基础操作行为(enter、leave、scroll、appear、click),用户行为多样并且形态复杂,因此首先需要将用户行为做标准化处理。此外随着业务使用后续有一些业务模块也要事件形式进入计算,例如http请求返回的结果也会作为一个事件,因为这里设计了一个插件机制,能够让业务模块快速转化成标准行为。

复杂计算

目前社区前端复杂计算相关方案都比较简单,不适用于业务场景。自研上选择参考业界CEP标准实现,业界CEP设计主要源于这篇论文Efficient Pattern Matching over Event Streams,在这篇文章里介绍了CEP的核心是NFA(不确定的有限状态机),CEP的匹配过程就是NFA状态变化的过程。因此首先在前端实现了一个NFA类,实现这样一个状态机。
|center
但是我们无法直接创建一个NFA去描述匹配规则,更习惯按照事件间关系与每个事件的匹配规则去定义,因此需要在上层封装一套API来创建NFA。这里参考了Flink CEP Pattern API的设计。通过next/followedBy/followedByAny/notNext/notFollowedBy等API来定义事件间关系,通过where/and/or等API来定义每个事件的匹配规则。通过Pattern定义会生成一个中间链表,生成NFA的过程就是反向解析这个链表。
|center
前端做复杂计算我们总会担心性能是否有问题。以下面这个性能压测为例,有20个策略在做匹配的情况下,一次灌入200条行为数据,整体耗时在3.73s。虽然时间并不是特别长,但是由于浏览器运行机制,JS引擎线程在执行的情况下,UI渲染线程也会被挂起,在这3.73s内用户所有在页面上的操作都得不到响应,感觉就是“卡住了”。因此前端复杂计算性能优化更多需要考虑计算过程中不能影响用户体验。
|center
对比目前业内的解法,Worker和Webassembly存在容器限制以及优化效果可能不明显。这里选用了一种时间切片的解法,整体思路和React Fiber机制比较类似。将复杂计算的大任务拆解为小任务执行,在小任务执行完之后,会适当让出JS主执行线程的控制权,让浏览器能够响应用户操作,保证用户操作不受影响。下面这张图是优化后的效果,可以看到每个任务执行之后有一段空闲。并且这个优化方式是纯JS层面的优化,不受单一容器的限制。
|center

用户触达

用户触达模块管理用户前台展示组件,出于对bundle大小的考虑,组件代码都通过动态加载的方式。由于需要针对不同容器实现,在上层统一标准组件的设计,包括统一组件API、输入数据源以及埋点信息等。组件相关设计最终会影响各容器实现成本和业务效果统计。

数据同步

由于跨页面场景(例如访问了详情页又访问了这个卖家的闲鱼号)存在,而前端多个页面之间不具备通信能力,也不存在一个线程在后台一直处理业务逻辑,因此在行为数据以及计算状态的同步上需要依赖本地存储能力。前端本地存储都只支持Key/Value存储,能力相对较弱,频繁读写数据容易出错。因此在本地存储上层实现一层内存缓存,扩展了一些存储能力,每隔一段时间或者在一些时间节点上(例如离开页面)和本地存储同步,这样既保证了存储的灵活性,又实现了跨页面数据同步。

未来展望

目前该前端CEP框架已投入线上业务使用,在阿里小程序、Weex、Web下都能良好运行,并且提供了一定的运营配置能力,在目前线上单一策略下整个流程可以在毫秒级内完成,后续在业务上会有更广泛的使用。
在技术细节以及业务易用性上,我们依然有很多可以完善的地方,后续的一些演进方向如下:

  1. 端内外全链路触达:与服务端、客户端在行为定义、规则计算、触达干预上统一一套标准协议,在闲鱼端内外全链路上此类问题通过统一一个系统承接。
  2. 运营体系完善:让业务更加便捷构建策略投放,在数据挖掘上能够更好辅助业务做决策。
  3. 智能化:将目前依据业务经验的规则匹配向算法根据用户行为智能决策转化,同时探索前端智能化的可能性。
相关文章
|
9月前
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
891 1
|
10月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
600 70
|
10月前
|
JavaScript 前端开发 API
|
9月前
|
存储 消息中间件 前端开发
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
校园圈子系统校园论坛小程序采用uni-app前端框架,支持多端运行,结合PHP后端(如ThinkPHP/Laravel),实现用户认证、社交关系管理、动态发布与实时聊天功能。前端通过组件化开发和uni.request与后端交互,后端提供RESTful API处理业务逻辑并存储数据于MySQL。同时引入Redis缓存热点数据,RabbitMQ处理异步任务,优化系统性能。核心功能包括JWT身份验证、好友系统、WebSocket实时聊天及活动管理,确保高效稳定的用户体验。
529 4
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
|
前端开发 JavaScript 开发者
颠覆传统:React框架如何引领前端开发的革命性变革
【10月更文挑战第32天】本文以问答形式探讨了React框架的特性和应用。React是一款由Facebook推出的JavaScript库,以其虚拟DOM机制和组件化设计,成为构建高性能单页面应用的理想选择。文章介绍了如何开始一个React项目、组件化思想的体现、性能优化方法、表单处理及路由实现等内容,帮助开发者更好地理解和使用React。
306 9
|
12月前
|
安全 前端开发 开发工具
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
596 5
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
|
前端开发 API
通义灵码企业级检索增强-前端自研场景采纳率提升DEMO
通义灵码企业级检索增强DEMO展示了通过对话方式检索企业内部知识的能力,特别是在前端自研场景中。例如,上传标准化组件库后,系统能准确推荐trace ID等组件的规范写法,显著提升采纳率8个百分点,效果明显。
215 2
|
前端开发 JavaScript API
前端界的秘密武器:掌握这些框架,让你轻松秒杀99%的同行!
前端开发日新月异,掌握几个明星框架如React、Vue.js和Angular,不仅能让工作更得心应手,还能轻松超越同行。React以高效的虚拟DOM和组件化著称;Vue.js简洁易懂,灵活性高;Angular提供全面的解决方案,适合大型应用。此外,轻量级的Svelte也值得关注,其编译时处理设计提升了应用性能。掌握这些框架,结合深刻理解和灵活运用,助你在前端领域脱颖而出。
243 9
|
JavaScript 前端开发 测试技术
前端全栈之路Deno篇(五):如何快速创建 WebSocket 服务端应用 + 客户端应用 - 可能是2025最佳的Websocket全栈实时应用框架
本文介绍了如何使用Deno 2.0快速构建WebSocket全栈应用,包括服务端和客户端的创建。通过一个简单的代码示例,展示了Deno在WebSocket实现中的便捷与强大,无需额外依赖,即可轻松搭建具备基本功能的WebSocket应用。Deno 2.0被认为是最佳的WebSocket全栈应用JS运行时,适合全栈开发者学习和使用。
878 7
|
缓存 前端开发 JavaScript
前端serverless探索之组件单独部署时,利用rxjs实现业务状态与vue-react-angular等框架的响应式状态映射
本文深入探讨了如何将RxJS与Vue、React、Angular三大前端框架进行集成,通过抽象出辅助方法`useRx`和`pushPipe`,实现跨框架的状态管理。具体介绍了各框架的响应式机制,展示了如何将RxJS的Observable对象转化为框架的响应式数据,并通过示例代码演示了使用方法。此外,还讨论了全局状态源与WebComponent的部署优化,以及一些实践中的改进点。这些方法不仅简化了异步编程,还提升了代码的可读性和可维护性。
413 1

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
    794
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    356
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    277
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    245
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    366
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    508
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    338
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    168
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    333
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    317