【发布时间】:2012-11-16 09:23:04
【问题描述】:
我需要使用 ESPER 实现一个规则引擎
为此我必须准备查询规则(如果有任何其他优化方式,请提出)。规则必须在运行时可声明和修改。
我还必须创建一个 UI 来定义规则。
请提出任何更好和优化的方法。
例如:
可以在运行时定义更多规则。
【问题讨论】:
标签: rule-engine esper complex-event-processing
我需要使用 ESPER 实现一个规则引擎
为此我必须准备查询规则(如果有任何其他优化方式,请提出)。规则必须在运行时可声明和修改。
我还必须创建一个 UI 来定义规则。
请提出任何更好和优化的方法。
例如:
可以在运行时定义更多规则。
【问题讨论】:
标签: rule-engine esper complex-event-processing
可以参考的上下文非常少,但一个简单的解决方案是简单地保持每个订单和每个价格的最新状态,并将每个规则作为引擎订阅来实施。您的引擎可以使用以下 EPL 语句进行初始化:
/* Minimal schema-s */
create schema LiveOrder (user string, orderid string, quantity, double, symbol string);
create schema LivePrice (symbol string, price double);
/* create two windows to store the latest order by orderid, and latest price by symbol */
create window LiveOrders.std:unique(orderid) as select * from LiveOrder;
create window LivePrices.std:unique(symbol) as select * from LivePrice;
/* insert data into the windows when data arrives */
insert into LiveOrders select * from LiveOrder;
insert into LivePrices select * from LivePrice;
此时,您将存储所有订单和价格,因此可以轻松地将它们“加入”不同的规则。如果用户在下单和订购数量 > 100 时需要警报,您只需创建以下 EPL 语句并附加一个监听器即可发送警报:
select * from LiveOrders where user='U1' and quantity > 100;
要在任何交易品种的订单金额超过 10000 时创建警报,您对这个 EPL 执行相同操作:
select LiveOrders.symbol as symbol, LiveOrders.quantity*LivePrices as total from LiveOrders
inner join LivePrices on LiveOrders.symbol=LivePrices.symbol
where LiveOrders.quantity*LivePrices > 10000
当不再需要警报时,您只需移除侦听器并销毁 EPL 语句。
【讨论】: