Flink CEP 基本概念及使用规则
CEP的概念:
Ø复杂事件处理(Complex Event Processing),用于识别输入流中符合指定规则的事件,并按照指定方式输出。
Ø起床—>洗漱—>吃饭—>上班一系列串联起来的事件流形成的模式
Ø浏览商品—>加入购物车—>创建订单—>支付完成—>发货—>收货事件流形成的模式。
通过概念可以了解,CEP主要是识别输入流中用户指定的一些基本规则的事件,然后将这些事件再通过指定方式输出。
如下图所示: 我们指定“方块、圆”为基本规则的事件,在输入的原始流中,将这些事件作为一个结果流输出来。
CEP的使用场景:
像用户异常检测:我们指定异常操作事件为要输出的结果流;策略营销:指定符合要求的事件为结果流;运维监控:指定一定范围的指标为结果流;银行卡盗刷:指定同一时刻在两个地方被刷两次为异常结果流。
在Flink CEP API中,主要通过Pattern 类来进行实现。CEP模式主要分为三种模式:
1、个体模式
Ø单例模式:只接收一个事件
p 触发条件 (.where()/.or()/.until())
Ø循环模式:可以接收一个或多个事件
p单例 +量词(在个体模式后追加量词,指定循环次数)
个体模式分为单例模式和循环模式:
单例模式只接收一个事件,主要通过(.where()/.or()/.until())等条件触发,使用规则如下:start为定义的变量。
循环模式可以接收一个或多个事件,使用规则为 单例+量词,如下图所示:
2、组合模式(多个个体模式的组合)
Ø严格连续(next)
Ø中间没有任何不匹配的事件
Ø宽松连续(followBy)
Ø忽略匹配的事件之间的不匹配的事件
Ø不确定的宽松连续(followByAny)
Ø一个匹配的事件能够再次使用
组合模式主要分为 三种使用规则: 但是在使用组合模式之前,必须以初始模式开始,使用begin() 控制,如下图:
(1)严格连续,通过next()方法控制,这句话是指用户定义的基本事件,如最上图中的方块,必须是连续都是方块,不能出圆圈。可以通过下图理解。
(2)宽松连续,通过followBy()控制,中间可以有不匹配的事件
(3)不确定的宽松连续,通过followByAny()方法控制,表示一个匹配的事件可以多次被使用
组合模式还包含:“不希望出现某种连续关系”:
.notNext()—— 不想让某个事件严格近邻前一个事件发生
.notFollowedBy()——不想让某个事件在两个事件之间发生
组合模式注意事项:
所有组合模式必须以.begin()开始;组合模式不能以.notFollowedBy()结束;"not"类型的模式不能被optional所修饰;此外,还可以为模式指定时间约束,用来要求在多长时间内匹配有效。
3、模式组
Ø一个组合模式作为条件嵌套在个体模式里pPattern((ab)c)
为例帮助大家更好的理解CEP的API使用,接下里通过两个案例,对CEP的使用进行讲解。
(a)电商案例——条件创建订单之后15分钟之内一定要付款,否则取消订单
案例介绍:在电商系统当中,经常会发现有些订单下单之后没有支付,就会有一个倒计时的时间值,提示你在15分钟内完成支付,如果没有完成支付,那么该订单就会被取消,主要是因为拍下订单就会减库存,但是如果一直没有支付,那么就会造成库存没有了,后面购买的时候买不到。
在CEP概念介绍时,引入过一条链路:
Ø浏览商品—>加入购物车—>创建订单—>支付完成—>发货—>收货事件流形成的模式。
上述模式是标准的电商事件流,我们案例中定义的CEP规则是 创建订单—>支付完成 这两个环节,要求是,判断15分钟内是否付款,否则订单取消。
代码设计:
Ø(1)定义实体类:订单编号,订单状态(1 创建订单,等待支付,2支付订单完成,3取消订单,申请退款,4已发货,5确认收货,已经完成)订单创建时间,订单金额
Ø(2)创建运行环境,设置流时间特性为事件时间,设置并行度
Ø(3)设置Source源
Ø(4)定义Pattern模式,指定条件
在Pattern模式中,我们使用到了个体模式,组合模式
- 首先,使用begin()方法以模式作为开始;
- 其次,由于创建的CEP规则是 创建订单—>支付完成 ,则在单例模式下,通过where条 件触发订单的状态已将处于 1 创建订单,等待支付状态
- 接着,通过宽松连续followBy()方法忽略15分钟内的产生的其他订单,所以使用宽松连续。
- 然后,通过where条件触发订单的状态是否已将处于 2 支付完成。
- 最后,通过within()方法判断第二次触发的订单是否在支付的15分钟内完成。
Ø(5)订单超时检测
Ø(6)运行结果对比
查看最终的运行结果,可以得知201608041140.... 这个订单的状态为1,且没有其他状态,最终被系统判断为超时订单。
(b)系统登录案例——当2秒内出现两次登录失败(“fail”)时,输出异常报警信息
同样,根据上述信息,我们做以下代码设计:
Ø(1)设置实体类:用户ID,登录IP,事件类型,事件时间
Ø(2)设置环境,指定source源,传入实体类
Ø(3)定义pattern匹配模式(规则),指定条件
begin: 第一次;where: 出现 fail;next: 紧接着第二次出现 fail;times: 出现一次 ;within:表示在2秒内。
Ø(4)结果对比
查看最终的运行结果,可以得知服务器编号为1,连续2秒在两个服务器登录,登录失败;服务器编号为3,连续2秒在一台服务器登录,登录失败!
以上就是CEP的讲解内容!觉得好的,点赞,在看,分享三连击,谢谢!!!
为回馈广大计算机爱好者,本博主专门整理了关于Java、大数据、算法、前端、人工智能、操作系统、网络等所学知识的书籍,如果看到此博文的小伙伴们,觉得对你有帮助,就快速领取吧!
作者简介:3分钟秒懂大数据,互联网大厂担任大数据算法开发工程师,秋招7offer。
CSDN博: 逆流而上Mr李_在IT中穿梭旅行_CSDN博客-数据结构,java,Flink领域博主