摘要:Siddhi是一个有趣的项目。Siddhi这个名称在僧伽罗语(斯里兰卡官方语言之一):意为"事件"(incIDEnts),在泰米尔语(斯里兰卡另一官方语言):意为"知识"(knowledge)。
Siddhi是一个有趣的项目。Siddhi 这个名称在僧伽罗语(斯里兰卡官方语言之一):意为 "事件" (incIDEnts),在泰米尔语(斯里兰卡另一官方语言):意为 "知识" (knowledge)。
它诞生于2011年斯里兰卡莫拉图瓦大学的一个毕业设计项目。创始团队选择这个具有双重文化意义的词汇,巧妙地体现了,技术本质:作为处理"事件"的流处理引擎和,学术追求:获取和处理数据"知识"的目标。
Siddhi的流处理和复杂事件处理(CEP)方法,以其类SQL查询语言、轻量级部署灵活性和经过实战考验的企业应用而著称。Siddhi每日在Uber处理超过200亿个事件,并作为eBay安全监控的核心支撑,通过其复杂的CEP能力、可嵌入架构和业务用户友好语法的结合,在流处理生态系统中占据了一个专业化的细分市场 (关于CEP,参考另一个开源产品 : 流处理的前世今生(一)复杂事件处理的王者Esper)。
该项目获得了显著的早期认可,连续四年(2014-2017)成为ACM DEBS挑战赛的决赛入围者,这对于通用CEP引擎来说是独一无二的殊荣。
Siddhi创始团队于2011年发表了奠基性研究论文《Siddhi: A Second Look at Complex Event Processing architectures》,为这项后来成为重要企业技术的工作奠定了理论基础。Siddhi后来成为超过60篇研究引用和多篇博士论文的基础。
Siddhi的架构了为高吞吐量、低延迟流处理而设计。系统采用四模块核心架构,有效地分离了关注点:
Siddhi查询编译器通过查询API将流式SQL转换为可执行的POJO,在编译期间实现语义验证和优化。Siddhi核心管理执行运行时和外部系统交互。
事件处理遵循复杂的管道架构。事件从源头通过SourceMapper流入Stream Junction——中央路由机制。系统使用事件处理而非微批处理,实现亚毫秒级延迟。事件采用分层结构:外部事件(带时间戳和对象数组)转换为内部StreamEvent(带beforeWindowData、onAfterWindowData、outputData),然后转换为StateEvent用于复杂的多流操作。
内存优化通过事件生命周期管理实现。系统在窗口处理前清除beforeWindowData,通过next属性链接事件以实现高效的批处理,并依赖分代垃圾回收处理短生命周期的事件对象。这种设计能够每秒处理数百万个事件,同时保持最小的内存占用。
查询执行模型因查询的复杂性而异。简单的过滤和窗口查询使用带链式处理器的ProcessStreamReceiver(FilterProcessor → StreamProcessor → WindowProcessor → QuerySelector)。连接(Join)查询从双流汇合处消费,在匹配操作期间使用线程安全的窗口锁定。模式和序列查询通过PreStateProcessor和PostStateProcessor链采用状态机处理,用于复杂的时序关系处理。
source https://siddhi.io/en/v4.x/images/architecture/siddhi-event-flow.png
应用程序可以将Siddhi嵌入为轻量级Java/Python库(
Siddhi的工具生态系统展现了对开发者生产力的承诺。基于Web的IDE提供文本和图形开发界面,具有语法高亮、自动完成和实时调试功能。事件模拟能力支持无需外部数据源的全面测试。
Siddhi的流式SQL支持声明式语法模仿传统SQL,同时添加流式构造:
@app:name('FraudDetection')define stream TransactionStream (userId string, amount double, location string, timestamp long);@info(name = 'SuspiciousPatterns')from TransactionStream#window.time(5 min)select userId, sum(amount) as totalAmount, count as txnCountgroup by userIdhaving totalAmount > 10000 and txnCount > 20insert into SuspiciousActivity;复杂的时序逻辑
from every e1=LoginStream -> e2=TransferStream[e1.userId == e2.userId and e2.amount > 5000] within 2 minselect e1.userId, e2.amount, e1.location, e2.locationinsert into RiskAlert;查询语言支持复杂的窗口操作,包括时间窗口(#window.time)、长度窗口(#window.length)和批处理窗口(#window.timeBatch)。命名聚合提供增量时间序列计算,具有从秒到年的自动粒度管理。
Siddhi代表了一个成熟和专业化的流处理和CEP应用解决方案,优先考虑易用性、部署灵活性和经过验证的可靠性,而非尖端的分布式处理能力。Siddhi的竞争优势包括其轻量级部署灵活性、类SQL语法、丰富的CEP功能和经过验证的企业可靠性。该系统在嵌入式场景、中等规模处理和需要复杂模式匹配能力的用例中表现出色。
我们看到Siddhi提供了面向开发者的一些友好特性,例如图形开发界面,事件模拟能力等等,这些是Flink和Spark等项目所缺乏的。但是Siddhi在一个日益拥挤的流处理市场中竞争,仅仅这一部分的改进还不足以撼动Flink这样的市场领导者。
来源:闻数起舞