作者:vivo 互联网服务器团队

本文是《vivo营销自动化技术解密》的第5篇文章,重点分析介绍在营销自动化业务中实时营销场景的背景价值、实时营销引擎架构以及项目开发过程中如何利用动态队列做好业务流量隔离,动态发布,使用规则引擎来提升营销规则的配置效率等几种关键技术设计实践。

《vivo营销自动化技术解密》系列文章:

  1. vivo营销自动化技术解密|开篇

  2. 设计模式如何提升 vivo 营销自动化业务扩展性 | 引擎篇01

  3. 状态机引擎在vivo营销自动化中的深度实践 | 引擎篇02

  4. 工作流引擎在vivo营销自动化中的应用实践 | 引擎篇03

一、背景

营销自动化的触达场景按照时效性划分主要有两大类:

1. 离线目标用户群发。

通过对业务离线数据的分析决策,制定合适的运营策略对目标用户进行群发触达。典型的场景有:新品推荐、活动预热、定期关怀、用户召回等。

2.实时个性化触达。

通过分析单个用户在一段指定时间内的行为轨迹,进行个性化的实时性营销触达。典型的场景有:支付提醒,满足活动条件触达等。

离线目标用户群发一般根据活动规则,T+n或者周期性对大数据离线用户数据进行批处理分析查询,获取满足条件的目标用户,从而进行营销触达。

需要关注的问题是:海量大数据的储存、查询性能和稳定性。而相比于离线目标用户群发,实时个性化触达对时效性的要求更高,一般来说触达效果也会更优,比如:

  1. 对24小时内收藏订单后,同时加入购物车的用户,push推送活动领券提醒;

  2. 对领取优惠券1小时内未使用的用户,推送使用提醒;

  3. 对活动期间成功下单总金额达到999元的用户,推送领取奖励提醒;

实时个性化触达需要关注问题包括:

1. 事件实时接入的高扩展性 。

需要快速支撑接入不同业务系统的各类行为事件和规则,需要进行统一的分发处理。

2.高性能高可靠统一分发处理。

3.复杂多源数据的处理。

包括数据的补全,各种规则指标的统计,目标用户的交并差计算。

4.高效可扩展的规则匹配。

对业务定义的各种复杂规则,需要有一套强扩展性的规则匹配工具。

二、核心架构设计分析

接入层

提供多种业务事件数据接入方式(比如支持异构外部系统的通用HTTP,内部的DUBBO、MQ等),最后转成MQ的方式统一分发。

  1. 由于事件数据源的不同,需要对宿主业务进行队列流量隔离管控,同时还需要评估后续队列的容量伸缩效率。

  2. 需要满足新增事件时,无需对系统进行重新部署,需要进行动态消息队列接入(下文会进行详细解析)。

数据处理层

实时引擎的核心部分。主要负责对事件数据进行加工处理,主要包括:

  1. 业务数据的统一标识补全,将多源数据进行打通关联。

  2. 对业务数据进行各种指标计算。常见的是基于时间窗口和会话窗口的流式计算,一般使用Flink来搭建。

  3. 目标用户匹配。常用的用户直接交并差集计算,能够更好的对目标用户进行实验。

  4. 业务规则匹配。基于业务逻辑对用户的数据进行匹配。

数据输出层

负责结果数据输出分发,主要目的是数据调配和触达发送策略。

数据管理

保存事件元数据的配置。

数据仓库

离线数据的储存,作用于流程中各种数据处理流程。

三、关键组件和流程设计

3.1 事件实时接入的扩展性设计

由于公司内部业务技术栈不尽相同,需要支持多种业务事件数据接入方式,比如通用HTTP接口,Java技术栈的DUBBO接口、和MQ消息队列的方式,为了系统内部可以进行统一管理,最后转成MQ的方式进行统一分发。

3.1.1 接入队列设计

由于事件数据源的不同,需要对宿主业务进行MQ队列流量管控隔离。不同业务系统事件接入需求有以下不同的设计方案:

方案一:为每个接入的事件创建一条新队列,不同事件使用不同队列。

  • 优点:最小粒度的流量控制,不同事件接入之间可以做到隔离,互不影响。

  • 缺点:每次接入新事件都需要申请创建队列,随着事件接入数据增加,队列维护成本比较高。

方案二:同一接入方的事件使用同一队列,不同接入方使用不同队列(目前消息中心的方案)

  • 优点:按接入方来进行流量控制,接入方之间进行隔离,同一接入方只需在首次接入使用时创建队列,后续接入新事件无需创建。

  • 缺点: 不同接入方接入时需要创建队列,同一接入方不隔离,有相互影响的风险。

方案三:不同接入方、事件均使用同一队列

  • 优点:业务方使用友好,后续接入无需变更,耦合度小,方便切换MQ中间件。

  • 缺点:最大粒度的流量控制,无法做到隔离,风险较高,需要经常进行队列扩容。

方案四:事先评估每个事件的优先级(如流量),高优先级的事件单独创建一条队列,低优先级的事件共用同一队列

  • 优点:按事件的维度进行流量控制。

  • 缺点:对接入方使用不够友好,不同业务接入时需要创建队列。

各方案对比如下:

结论:按照当前项目优先级综合评估来看,业务隔离性>可伸缩性>可维护性>接入方友好性。

方案二比较适合 。(不同的项目可以根据自己的实际情况按优先级进行合适的选型)

3.1.2 动态消息监听

背景:当需要做好业务间风险隔离时,就必须按业务或者事件的维度进行队列拆分。此时若进行新接入事件就可能需要重新创建新的队列。

初期方案:采用公司中间件vivo-rmq, 当接入方需要新增队列时,需要修改代码新增队列监听,重新发版,这样做的问题是重新发版成本较高,按照项目流程管理进行效率低。

优化方案一: 修改启动加载类加载指定目录下的配置文件,新增队列时修改配置文件上传。

  • 优点:无需发版。

  • 缺点:仍需要重启服务器,同时需要维护配置文件目录等信息。

优化方案二:保存队列配置信息到数据表中,启用定时任务在服务器运行时动态监听数据库配置,新增或者下线队列配置记录后,自动进行队列变更。

  • 优点:无需发版和重启。

  • 缺点:定时任务实时性稍差,必须确保队列监听成功后在通知业务方接入。

结论:采用方案二,新增事件无需对系统进行重新部署,使用运行时动态方式进行消息队列接入。

3.2 统一分发处理

抽象公共分发模板:事件参数和有效性检测 → 分发到事件规则匹配器 EventMatcher →  输出到渠道发送流程

可靠平滑启停

1. MQ消费端分发主流程未处理完成,系统重启可能会造成事件消息丢失。

解决方案 :配置MQ消费端没有返回ack时,MQ服务端重新发送消息,此时业务消费必须保证幂等性。

2. MQ分发主流程处理完成已返回ack,但是在分发到业务线程池过程中 ,由于JVM重启而丢失。

解决方案 :这种场景时间极短,可以等待分发完成再进行ack。

3. MQ分发主流程分发到业务线程池处理过后, 但是线程池处理渠道发送过程仍可能因为JVM重启而丢失。

解决方案 :

  1. 利用JVM ShutdownHook钩子函数设置重启标记flag,MQ取数据时可以根据flag不再取出数据;

  2. 业务线程池不再接受新的任务,  同时利用线程池自身的Hook,等待处理线程池完成已有的任务。

3.3 复杂多源数据的处理

指标补全

业务接入方可以提前将业务数据加载到统一大数据平台,并补充元数据配置,支持实时事件数据之外的数据补全。

指标统计

对规则配置数据进行,使用Flink CEP负责事件处理,支持时间窗口计算。

交并差运算

基于Presto计算查询引擎,对不同目标用户群进行交并差负责运算,得到处理后的结果数据。

3.4 规则匹配器义

传统方案 

使用简单直接的硬编码的方式,根据不同的事件条件进行编码处理,适合迭代更新要求低的小型系统。

传统方案存在的问题

  1. 硬编码开发成本高,交付时间长,难以应对需求变化。

  2. 业务规则重复累赘,难以维护。

  3. 业务规则发生变化需要修改代码,重启服务后才能生效。

规则引擎

狭义上的规则引擎是业务规则管理系统,英文名为BRMS(即Business Rule Management System),指一整套的规则管理解决方案。

广义上的规则引擎是指一个可以将业务决策从应用程序代码中分离出来的输入输出组件,接收业务数据输入,并根据业务规则输出决策。

规则引擎重点关注的是:规则配置的通用性和扩展性,以及规则匹配的性能。

规则引擎优点

  1. 业务规则与系统代码分离,实现业务规则的集中管理。

  2. 在不重启服务的情况下可随时对业务规则进行扩展和维护。

  3. 可以动态修改业务规则,从而快速响应需求变更。

  4. 规则引擎是相对独立的,只关心业务规则,使得业务分析人员也可以参与编辑、维护系统的业务规则。

  5. 减少了硬编码业务规则的成本和风险。

  6. 使用规则引擎提供的规则编辑工具,使复杂的业务规则实现变得的简单。

规则引擎的实现选型

目前开源规则引擎 Drools、Easy Rules、表达式引擎Aviator,还有动态语言Groovy、甚至直接使用SpEL进行封装都可以作为规则引擎的一种实现方案。

  1. 如果需要搭建一整套完整BRMS的功能,从规则配置工作台,图形化语言建模,规则库管理等一站式解决方案,可以直接选用Drools。这也是大家认为Drools使用起来比较“重”的原因,组件繁多逻辑复杂,学习成本高。

  2. 如果业务场景相对简单,只是希望解决规则迭代频繁的问题,提升配置管理的扩展性,可以选用Easy Rules或者利用表达式引擎Aviator为基础搭建。

规则引擎常用应用场景

  1. 风险控制系统:风险贷款、风险评估

  2. 反欺诈项目:银行贷款、征信验证

  3. 决策平台系统:财务计算

  4. 促销平台系统:满减、打折、加价购等营销场景

  5. 其他应用场景

四、总结

本文重点分析介绍在营销自动化业务中实时营销引擎的设计,实时营销是通过分析单个用户在一段指定时间内的行为轨迹,产生动态的运营决策,可以对用户进行即时性的触达。

实时营销引擎架构设计主要分为事件接入、数据处理、指标计算、数据输出、元数据配置和数仓管理等模块。在项目开发过程我们利用队列隔离做好业务流量隔离,队列动态配置支持事件高效接入发布,统一分发处理提升流程的抽象化,平滑发布保障数据的可靠性,规则引擎来提升营销规则的配置效率。

实时营销引擎在vivo营销自动化中的实践 | 引擎篇04的更多相关文章

  1. 工作流引擎在vivo营销自动化中的应用实践 | 引擎篇03

    作者:vivo 互联网服务器团队- Cheng Wangrong 本文是<vivo营销自动化技术解密>的第4篇文章,分析了在营销自动化业务引入工作流技术的背景和工作流引擎的介绍,同时介绍了 ...

  2. 状态机引擎在vivo营销自动化中的深度实践 | 引擎篇02

    本文是<vivo营销自动化技术解密>的第3篇文章,分析了营销自动化业务背景和状态机引入原因.状态机的三种基本实现方式,同时介绍了几种业界流行的开源状态机框架实现和特点,以及在项目开发过程中 ...

  3. 设计模式如何提升 vivo 营销自动化业务扩展性 | 引擎篇01

    在<vivo 营销自动化技术解密 |开篇>中,我们从整体上介绍了vivo营销自动化平台的业务架构.核心业务模块功能.系统架构和几大核心技术设计. 本次带来的是系列文章的第2篇,本文详细解析 ...

  4. vivo营销自动化技术解密|开篇

    一.营销自动化概览 1.1. 什么是营销自动化 营销自动化是指专门为营销部门或组织设计的软件平台和技术,可以更有效地在线进行多渠道营销并使重复性任务自动化.营销部门和销售人员通过制定任务和流程的操作标 ...

  5. 投资20万研发的JFinal项目《旅游线路营销管理系统》准备公开课中

    18年初上线了一套旅游营销管理系统,目前给几个合作客户内测试用,是基于JFinal研发的一套旅游行业旅游线路批发零售系统(SAAS)版. 系统终端: PC后台管理分:总部.线路批发商.旅行社门店.个人 ...

  6. 规则引擎-BRMS在企业开发中的应用

    1. 什么是规则复杂企业级项目的开发以及其中随外部条件不断变化的业务规则(business logic),迫切需要分离商业决策者的商业决策逻辑和应用开发者的技术决策,并把这些商业决策放在中心数据库或其 ...

  7. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  8. 转!!MySQL中的存储引擎讲解(InnoDB,MyISAM,Memory等各存储引擎对比)

    MySQL中的存储引擎: 1.存储引擎的概念 2.查看MySQL所支持的存储引擎 3.MySQL中几种常用存储引擎的特点 4.存储引擎之间的相互转化 一.存储引擎: 1.存储引擎其实就是如何实现存储数 ...

  9. tomcat中的JSP引擎

    jsp文件解析成class文件过程需要利用tomcat的jasper组件. Jasper是tomcat中使用的JSP引擎,在Tomcat 6中使用的是Jasper 2,相对于原来的版本作了不少的改进, ...

随机推荐

  1. 在Webpack 5 中如何进行 CSS 常用配置?

    本文摘要:主要通过实操讲解运用Webpack 5 CSS常用配置的方法步骤 前文已谈到可以通过配置 css-loader 和 style-loader,使 webpack5 具有处理 CSS 资源的能 ...

  2. 国产钡铼分布式IO模块如何与西门子PLC Profinet通讯

    1.准备IO模块:耦合器BL200PN.数字量输出模块M2082.数字量输入M1081.模拟量输入模块M3401.模拟量输出M4043. 编辑搜图 请点击输入图片描述(最多18字) ​2.BL200P ...

  3. 项目操作案例丨西门子PLC通过网关连接ACS800变频器

    本案例控制对象为炉条机.以及蒸汽的控制以及现场数据参数的显示以及报警. PLC 选用西门子 CPU,通过 ET200 IO 模块控制现场设备并监控数据.变频器采用ABB ACS800变频器,将ABB ...

  4. 项目经验记录丨Modbus转EtherNET/IP协议转换应用

    使用电脑通过软件来进行模拟 EtherNET/IP主站连接Mdodbus从站设备的项目记录.使用软件为EIPScan 模拟主站,通过Modbus转EtherNET/IP网关连接Modbus Slave ...

  5. Luogu2915 [USACO08NOV]奶牛混合起来Mixed Up Cows (状压DP)

    枚举末位状态 #include <iostream> #include <cstdio> #include <cstring> #include <algor ...

  6. HC32L110 系列 M0 MCU 的介绍和Win10下DAP-Link, ST-Link, J-Link的烧录

    HC32L110 系列 Cortex M0 MCU Hackaday 在三月份的时候介绍了一款最小的MCU NEW PART DAY: SMALLEST ARM MCU UPROOTS COMPETI ...

  7. 解读Gartner2022年组装式应用报告:从组装式企业到组装式应用

    摘要:"到2023年,采用组装式方法的组织在新特性交付速度比竞争对手快80%."Gartner 为什么未来的企业是组装式的? 物竞天择,适者生存,企业也是一样,在发展过程中,会为了 ...

  8. cad开发动态块对应的界面

    为了使设计人员更加容易的操作动态块, 应经可能对动态块的制作制定相关的规范, 如动态块的属性 => 类的属性 动态块操作名称(作为变量名,后台数据库的字段) 动态块操作描述  (作为注释,后台数 ...

  9. 一,DRF入门规范

    一 Web应用模式 在开发Web应用中,有两种应用模式: 1.1 前后端不分离 1.2 前后端分离 二 API接口 为了在团队内部形成共识.防止个人习惯差异引起的混乱,我们需要找到一种大家都觉得很好的 ...

  10. C#基础_VS常用快捷键

    Shift+End,Shift+Home,跳转到当前代码的行尾和行首. 1.窗口快捷键 记忆诀窍: 凡跟窗口挂上钩的快捷键必有一个W(Windows): Ctrl+W,W:  浏览器窗口 (浏览橱窗用 ...