1.基本介绍

Siddhi 提供以下功能,

流式数据分析

为分析操作员提供编排数据流、计算分析和检测 来自多个不同实时数据源的事件数据模式的软件,以允许开发人员构建能够实时感知、思考和行动的应用程序。

复杂事件处理 (CEP)

“CEP 是一种计算,其中有关事件的传入数据被提炼成更有用、更高级别的‘复杂’事件数据,从而提供对正在发生的事情的洞察力。”

“ CEP 是事件驱动的,因为计算是由接收事件数据触发的。CEP 用于要求高、持续智能的应用程序,以增强态势感知并支持实时决策。”

流数据集成

流数据集成是一种通过处理、关联和分析内存中的数据来集成多个系统的方法,同时不断地将数据从一个系统实时移动到另一个系统。

警报和通知

该系统根据定义的 KPI 和其他分析持续监控事件流,并发送警报和通知。

自适应决策一种根据预定义规则、连接系统的当前状态和机器学习技术动态做出实时决策的方法。

Siddhi cep_java


Siddhi cep_sql_02

2.使用流程

当Siddhi 应用程序启动时:

定义输入流,输出流,编写Siddhi查询sql;
接收各种流将事件传递给查询以进行处理。
根据查询完成的处理生成新事件。
最后,通过输出将新生成的事件发送到流。

3.sql样例

define stream TemperatureStream
(sensorId string, temperature double);

@info(name = 'Overall-analysis')
from TemperatureStream#window.timeBatch(1 min)
select avg(temperature) as avgTemperature,
max(temperature) as maxTemperature,
count() as numberOfEvents
insert into OverallTemperatureStream;

@info(name = 'SensorId-analysis')
from TemperatureStream#window.timeBatch(30 sec, 0)
select sensorId,
avg(temperature) as avgTemperature,
min(temperature) as maxTemperature
group by sensorId
having avgTemperature > 20.0
insert into SensorIdTemperatureStream;
define stream InputStream(jsonString string);

from InputStream
select json:toObject(jsonString) as jsonObj
insert into PersonalDetails;

from PersonalDetails
select jsonObj,
json:getString(jsonObj,'$.name') as name,
json:isExists(jsonObj, '$.salary') as isSalaryAvailable,
json:toString(jsonObj) as jsonString
insert into OutputStream;

from OutputStream[isSalaryAvailable == false]
select
json:setElement(jsonObj, '$', 0f, 'salary') as jsonObj
insert into PreprocessedStream;
TemperatureStream  (
sensorId string , temperature double );

define table TemperatureLogTable (
sensorId string, roomNo string, temperature double);

@store(type="rdbms",
jdbc.url="jdbc:mysql://localhost:3306/sid",
username="root", password="root",
jdbc.driver.name="com.mysql.jdbc.Driver")
define table SensorIdInfoTable (
sensorId string, roomNo string);

@info(name = 'Join-query')
from TemperatureStream as t join SensorIdInfoTable as s
on t.sensorId == s.sensorId
select t.sensorId as sensorId, s.roomNo as roomNo
t.temperature as temperature
insert into TemperatureLogTable;

4.总结:
优点:
1.sql模式,本身支持一些函数运算;

2.量词,组合模式,连续策略较为丰富;

3.支持不发生算子;

4.时间窗口内,数据聚合在函数支持下较为方便;

5.事件流可以支持和外部存储join;

缺点:

1.使用Siddhi Streaming SQL语言将处理逻辑编写为Siddhi 应用程序,开发和维护比java代码高,在sql里数据处理/异常/监控等不够灵活可控;

2.sql模式开发,对于现有的复杂json结构数据源,解析处理不友好;

3.长窗口聚合数据时,数据在内存中累积;

4.海外项目,文档资料少,维护成本高;

5.当前的复杂嵌套回溯类型,sql模式难以实现;