本篇主要演练使用Flink-Cep+Groovy+Aviator 来实现一个物联网监控规则中的一个场景案例,后续将会介绍如何实现规则动态变更。
技术背景简介
Flink-Cep 是flink中的高级library,用于进行复杂事件处理,例如某一类事件连续出现三次就触发告警,可以类比Siddhi、Esper;
Groovy 是一种动态脚本语言,可以让用户输入代码变成后台可执行代码,像刷题网站leetcode 应该就是用了这么类似的一个东西;
Aviator 用于执行求值表达式,例如求1>2的值,得到true,为什么用这个东西,也跟后续动态规则变更相关,接下来的案例也会具体介绍。
案例分析
物联网通常都是设备数据,比喻说设备的温度、耗电量等等,会有对设备的监控,例如求设备连续三个点的值大于10且三个点的求和值大于100,要求将这三个点发送到下游进行处理,首先看一下直接使用Flink-Cep api的实现:
case class DpData(dpId:String,value:Double)
val pattern=Pattern.begin("start",AfterMatchSkipStrategy.skipPastLastEvent()).where(new SimpleCondition[DpData] {
override def filter(value: DpData): Boolean = value.value>10
}).times(2).consecutive()
.next("next").where(new IterativeCondition[DpData] {
override def filter(value: DpData, ctx: IterativeCondition.Context[DpData]): Boolean = {
if(value.value>10) {
val sum=value.value+ctx.getEventsForPattern("start").map(_.value).sum
return sum>100