wso2~event-flow的介绍
我们来详细分析和介绍一下 WSO2 平台(特别是 WSO2 Stream Processor / WSO2 SI / Siddhi Runner)中 Event Receivers、Event Streams、Execution Plans 和 Event Publishers 这些核心概念。它们是构建实时流处理和复杂事件处理(CEP)应用的基础组件。
核心思想:事件驱动架构 (EDA)
这些组件共同构成了一个事件处理管道(Event Processing Pipeline),其核心流程是:
- 接收事件: 从外部来源获取原始事件数据 (
Event Receivers
)。 - 定义结构: 为事件数据定义一个明确的格式和含义 (
Event Streams
)。 - 处理逻辑: 对事件流进行过滤、转换、关联、聚合、模式匹配等计算 (
Execution Plans
)。 - 发布结果: 将处理结果(可能是新事件、告警、聚合值等)发送到下游系统 (
Event Publishers
)。
组件之间的关系:
graph TD;
A[Event Receivers] -->|接收事件| B[Event Streams]
B -->|流转事件| C[Execution Plans]
C -->|执行计划| D[Event Publishers]
D -->|发布事件| A
核心概念详解:
-
事件接收器 (Event Receivers)
- 功能: 它们是事件处理管道的入口点。负责监听、接收、解析和转换来自各种外部源的事件数据,并将其注入到 WSO2 平台内部的 Event Streams 中。
- 作用:
- 连接外部世界: 连接到消息队列(Kafka, JMS, RabbitMQ)、数据库(通过轮询)、HTTP/S 端点(REST, WebSocket)、TCP/UDP 套接字、文件、邮件等。
- 协议适配: 理解不同来源的协议和传输格式。
- 数据转换: 将接收到的原始数据(如 JSON, XML, CSV, Binary)解析并映射到内部事件流 (
Event Stream
) 定义的格式(通常是键值对或对象)。这个过程通常涉及定义映射规则(如@map
注解)。 - 注入事件: 将转换后的、格式统一的事件对象发布到指定的内部事件流中,供后续处理。
- 关键点:
- 一个 Receiver 通常对应一个特定的外部源和一种协议。
- 定义了输入事件如何映射到目标 Event Stream 的 schema。
- 是平台与外部事件生产者(如传感器、应用程序、日志文件)的桥梁。
-
事件流 (Event Streams)
- 功能: 定义了在 WSO2 平台内部流动的事件数据的结构和元数据。它们是事件在管道中传输和处理的载体和契约。
- 作用:
- 数据模型: 明确规定一个事件包含哪些属性(字段),每个属性的数据类型是什么(e.g.,
string
,int
,long
,float
,double
,bool
)。 - 唯一标识: 每个流有一个唯一的名称(通常由
Stream ID
和Stream Version
组成,如FooStream:1.0.0
)。 - 数据承载: 实际的事件数据按照这个定义的结构在系统中流动。
- 组件间连接: Event Receivers 将事件注入特定的 Stream, Execution Plans 从 Streams 读取事件进行处理,并将结果写入新的 Streams, Event Publishers 从 Streams 读取事件进行发布。
- 数据模型: 明确规定一个事件包含哪些属性(字段),每个属性的数据类型是什么(e.g.,
- 关键点:
- 类似于数据库表定义或消息队列中消息的 Schema。
- 确保处理逻辑 (
Execution Plans
) 明确知道它正在处理的数据是什么样子。 - 允许多个组件(Receivers, Execution Plans, Publishers)通过共享的 Stream 进行解耦的通信。
- 流中的事件通常是不可变的。
-
执行计划 (Execution Plans)
- 功能: 这是事件处理管道的大脑和核心逻辑单元。它定义了如何处理一个或多个输入事件流 (
Event Streams
) 中的数据,执行计算、分析、转换,并产生结果输出到一个或多个输出事件流 (Event Streams
)。 - 作用:
- 处理逻辑容器: 包含一个或多个Siddhi 查询 (SiddhiQL Queries)。SiddhiQL 是一种专门为流处理和 CEP 设计的 SQL-like 语言。
- 复杂计算: 执行各种操作,包括:
- 过滤:
select * from InputStream[price > 100]
- 投影:
select symbol, price from InputStream
- 窗口操作: 基于时间(
time window
)或数量(length window
)对事件进行分组聚合(avg
,sum
,min
,max
,count
)或排序。 - 模式匹配: 检测事件序列中的特定模式(
every e1=InputStream1 -> e2=InputStream2[e2.value > e1.value]
)。 - 关联/连接: 将不同流的事件基于条件关联起来(
join
,union
)。 - 机器学习/预测: 使用内置或扩展的函数进行简单预测或异常检测。
- 外部调用: 调用外部服务或函数(通过扩展)。
- 过滤:
- 状态管理: 维护处理过程中需要的状态(如窗口内的数据、计数器、会话信息)。
- 输出生成: 处理的结果会以新事件的形式写入到定义的输出事件流中。
- 关键点:
- 一个 Execution Plan 是处理逻辑的部署单元。它被打包和部署到 WSO2 SP/SI/Siddhi Runner 运行时中。
- 使用强大的 SiddhiQL 语言定义业务逻辑。
- 消费输入流,生产输出流。
- 可以非常复杂,实现实时分析、告警生成、实时仪表盘数据准备等。
- 替代术语注意: 在较新版本的 WSO2 SP/Siddhi Runner 中,“Execution Plan” 的概念有时直接被称为 “Siddhi App”。一个 Siddhi App 文件 (
.siddhi
) 包含了 Stream 定义、Receiver/Publisher 配置(通过注解)和 SiddhiQL 查询,本质上就是一个自包含的 Execution Plan。
- 功能: 这是事件处理管道的大脑和核心逻辑单元。它定义了如何处理一个或多个输入事件流 (
-
事件发布器 (Event Publishers)
- 功能: 它们是事件处理管道的出口点。负责从内部的 Event Streams 中读取处理完成的事件结果,将其转换成目标系统所需的格式,并发布/传输到各种外部接收系统(Sinks)。
- 作用:
- 连接下游系统: 连接到消息队列(Kafka, JMS)、数据库(JDBC 插入/更新)、HTTP/S 端点(REST API 调用)、TCP/UDP 套接字、文件、邮件、日志等。
- 协议适配: 使用下游系统理解的协议进行通信。
- 数据转换: 将内部事件流格式的事件对象映射并序列化成外部系统要求的格式(如 JSON, XML, CSV, Binary)。这个过程通常也涉及定义映射规则(如
@map
注解)。 - 传输事件: 将转换后的数据可靠地(或尽力而为)发送到目标系统。
- 关键点:
- 一个 Publisher 通常对应一个特定的外部目的地和一种协议。
- 定义了如何将输出 Event Stream 的数据映射到目标格式。
- 是平台与外部事件消费者(如数据库、仪表盘、告警系统、其他应用程序)的桥梁。
组件间关系与数据流:
想象一个实时的股票价格监控和告警系统:
- Event Receiver (HTTP): 监听一个 HTTP 端口,接收来自多个股票数据源的 JSON 格式的价格更新事件。它配置了
@map(type='json')
,将 JSON 字段映射到名为StockTickStream
的内部事件流的属性 (symbol
,price
,timestamp
)。 - Event Stream (
StockTickStream
): 定义了symbol (string)
,price (float)
,timestamp (long)
。 - Execution Plan (Siddhi App):
- 定义输入流:
StockTickStream
- 编写 SiddhiQL 查询:
- 计算每个股票 1 分钟滚动平均价:
... select symbol, avg(price) as avgPrice ... group by symbol ...
- 检测价格瞬间暴涨(比如 5 秒内涨幅超过 10%):
... every (e1=StockTickStream) -> e2=StockTickStream[e1.symbol==e2.symbol and (e2.price - e1.price)/e1.price > 0.1] within 5 sec ...
- 计算每个股票 1 分钟滚动平均价:
- 定义输出流:
AvgPriceStream
(schema:symbol
,avgPrice
)SpikeAlertStream
(schema:symbol
,startPrice
,endPrice
,increasePct
)
- 定义输入流:
- Event Publishers:
- Publisher 1 (Kafka): 订阅
AvgPriceStream
。配置@map(type='json')
,将事件转换为 JSON 并发布到 Kafka 的stock-avg-prices
主题,供实时仪表盘消费。 - Publisher 2 (Email/JMS): 订阅
SpikeAlertStream
。配置映射,将事件内容格式化为告警文本,通过 Email 发送给交易员或发送到 JMS 队列供告警系统处理。
- Publisher 1 (Kafka): 订阅
总结:
- Event Receivers & Publishers: 处理与外部系统的连接、协议适配和数据格式转换(输入/输出适配器)。它们是边界组件。
- Event Streams: 定义了在系统内部流动的事件数据的标准结构和契约。它们是数据流动的管道和连接组件的纽带。
- Execution Plans (Siddhi Apps): 包含了使用 SiddhiQL 编写的核心业务逻辑和处理规则。它们消费输入流,进行处理(过滤、聚合、模式匹配等),并将结果写入输出流。这是实现实时分析和 CEP 功能的引擎。
理解这些概念的关键:
- 管道化: 数据从 Receiver 进入 -> 流入 Stream -> 被 Execution Plan 处理 -> 结果流入另一个 Stream -> 由 Publisher 发送出去。
- 解耦: Streams 使得 Receivers、Execution Plans 和 Publishers 可以独立定义、修改和扩展,只要它们遵守 Stream 的契约(Schema)。
- 声明式处理: Execution Plans 使用 SiddhiQL 这种高级的声明式语言来描述“做什么”(如找出平均值或模式),而不是详细指定“怎么做”(如遍历循环),由运行时引擎优化执行。
掌握这四个核心概念是有效设计、开发和部署基于 WSO2 Stream Processor / Siddhi 的实时流处理应用程序的基础。