Drools 引擎:高流量应用程序的内存管理

Drools Engine: Memory management for a high-traffic application

这段代码的目的是监控不同类别的事件流向,根据相应类别的事件发生频率,对不同类别的事件提出不同级别的告警。 每个类别的告警级别递增,每个类别每个级别只插入1个Alarm对象。 警报如果它们足够旧并且不再满足任何规则,则它们必须过期。每个类别的每个级别警报的到期时间是不同的。此外,Events 必须在不同的时间到期以实现最佳内存使用。

AlarmEvent 对象都声明为 时,自动事件生命周期管理根本不起作用事件秒。如果我将 Alarm 声明为 factEvent 类型的对象将按预期被丢弃,但毫不奇怪,对象报警类型永远留在记忆中。

问:如何正确管理内存,丢弃不需要的Alarm/Event对象?首选使用 Drools 的推断过期;我可以以任何方式更改我的代码以使其工作吗?(比如向现有规则添加时间限制,也许?)将 expires 标记添加到 Event/告警类型不得已。

提前致谢

declare Event
    @role(event)
end

declare Alarm
    @role(event)
end

rule "Alarm Level 1"
    when
        $e : Event()
        not (Alarm(category == $e.getCategory(), level == 1)
    then
        Alarm a = new Alarm($e.getCategory());
        a.setLevel(1);
        insert(a);
end


rule "Alarm Level 2"
    when
        $alarm : Alarm(level == 1)
        not (Alarm(category == $alarm.getCategory(), level == 2)
        Number( intValue >= 5 ) from accumulate(
            $e : Event(category == $alarm.getCategory()) over window:time( 1h ),
            count($e) )
    then
        Alarm a = new Alarm($alarm.getCategory());
        a.setLevel(2);
        insert(a);
end

rule "Alarm Level 3"
    when
        $alarm : Alarm(level == 2)
        not (Alarm(category == $alarm.getCategory(), level == 3)
        Number( intValue >= 15 ) from accumulate(
            $e : Event(category == $alarm.getCategory()) over window:time( 2h ),
            count($e) )
    then
        Alarm a = new Alarm($alarm.getCategory());
        a.setLevel(3);
        insert(a);
end

编辑: 该项目的要求是监控 Events 的频率,并在必要时触发 Alarms(上面有更详细的描述)。那些 警报 也可以参与触发一组规则,每个规则都有自己的时间限制。

换句话说,我需要这样写一个规则:

rule "A"
    when
        $a Alarm($param : some_param, some_constraints, happened_in_last_n_secs)
        $e Event(some_param == $param, some_constraints, happened_in_last_m_secs)
    then
        do_stuff
end

Drools 中是否有类似以下代码的内容?

$eventA : Event( this before[ 0s, 4m ] time.now )

Drools 没有自动提供 Now 事实。

考虑创建此事件并在由具有适当间隔的计时器驱动的规则触发时更新其时间戳。

编辑 Drools 的自动时间戳必须被视为草率的解决方案。它当然最适合真实时间戳不是最重要或不可用的应用程序。否则,事件的时间戳应该在创建事件的位置确定并成为事件的属性之一。您可以像访问任何其他属性一样访问此字段,并使用时间运算符比较其值。