1.基本介绍
Siddhi 提供以下功能,
流式数据分析
为分析操作员提供编排数据流、计算分析和检测 来自多个不同实时数据源的事件数据模式的软件,以允许开发人员构建能够实时感知、思考和行动的应用程序。
复杂事件处理 (CEP)
“CEP 是一种计算,其中有关事件的传入数据被提炼成更有用、更高级别的‘复杂’事件数据,从而提供对正在发生的事情的洞察力。”
“ CEP 是事件驱动的,因为计算是由接收事件数据触发的。CEP 用于要求高、持续智能的应用程序,以增强态势感知并支持实时决策。”
流数据集成
流数据集成是一种通过处理、关联和分析内存中的数据来集成多个系统的方法,同时不断地将数据从一个系统实时移动到另一个系统。
警报和通知
该系统根据定义的 KPI 和其他分析持续监控事件流,并发送警报和通知。
自适应决策一种根据预定义规则、连接系统的当前状态和机器学习技术动态做出实时决策的方法。
2.使用流程
当Siddhi 应用程序启动时:
定义输入流,输出流,编写Siddhi查询sql; 接收各种流将事件传递给查询以进行处理。 根据查询完成的处理生成新事件。 最后,通过输出将新生成的事件发送到流。
3.sql样例
代码语言:javascript复制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;
代码语言:javascript复制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;
代码语言:javascript复制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模式难以实现;