從規則引擎到復雜事件處理(CEP)


    <p>Drools Fusion既是規則引擎,又可以作為CEP。除了<a href="/2013/12/21/event_in_CEP.html" title="事件定義">事件定義</a>和<a href="/2013/12/21/Temporal_of_CEP.html" title="時間推理">時間推理</a>之外,對於引擎本身也會有一些不同的使用。主要體現在會話時鍾、流模式、滑動窗口和對事件的內存管理。</p>

會話時鍾

由於事件的時間性,處理事件時需要一個參考時鍾。
這個參考時鍾在會話配置(KnowledgeSessionConfiguration)中指定,所以稱為會話時鍾(Session Clock)。

有很多種場景需要對時鍾進行控制,比如:

  • 規則測試

    測試總是需要一個可控的環境,並且當測試包含了帶有時間約束的 規則時,不僅需要控制輸入規則和事實,而且也需要時間流。

  • 定期(regular)執行

    通常,在運行生產規則時,應用程序需要一個實時時 鍾,允許引擎對時間的行進立即作出反應。

  • 特殊環境

    特殊環境可以對時間的控制有特殊的要求。群集環境可能需要在心 跳中的時鍾同步,或 JEE 環境可能需要使用一個應用服務器提供的時鍾,等 等。

  • 規則重演或模擬

    要重演場景或模擬場景也需要應用程序控制時間流。

Drools中默認使用基於系統時鍾的實時時鍾(realtime),也可以使用能被應用程序控制的偽時鍾(pseudo)。設置偽時鍾的方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
conf.setOption( ClockTypeOption.get( "pseudo" ) );

StatefulKnowledgeSession session =kbase.newStatefulKnowledgeSession( conf, null );

SessionPseudoClock clock = session.getSessionClock();

// then, while inserting facts, advance the clock as necessary:
FactHandle handle1 = session.insert( tick1 );
clock.advanceTime( 10, TimeUnit.SECONDS );
FactHandle handle2 = session.insert( tick2 );
clock.advanceTime( 30, TimeUnit.SECONDS );
FactHandle handle3 = session.insert( tick3 );

流模式

Drools默認運行在雲(Cloud)模式下。雲模式下沒有時間流的概念,引擎知道所有的事實(Fact)和事件(Event)。此時引擎將所有的事實/事件看做是一個無序的雲。

由於雲模式下引擎沒有“現在”的概念,盡管事件具有時間戳、期限等元數據,這些數據也僅僅作為事件的屬性,
不代表事件發生的順序,也不能進行

如果需要處理實時/准實時事件(Event),需要時間推理,Drools必須工作在流(Stream)模式下。
此時要求每個流中的事件必須按照時間順序插入。

啟用流模式

Drools默認運行在雲模式下,可以通過以下方式啟用流模式:

1
2
3
KnowledgeBaseConfiguration config =
KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
config.setOption( EventProcessingOption.STREAM );

也可以使用屬性文件定義:drools.eventProcessingMode = stream

入口點

Drools定義了工作空間的多個入口點(WorkingMemoryEntryPoint),每個入口點可以看做是一個事件流,可以將事件通過不同的入口點插入到工作空間中。

來自同一個入口點的事件通過時間戳被排序。每個流既可以包含單一類型的事件,也可以包含多種類型的事件。

  • 聲明入口點

    入口點不需要顯式聲明,在規則中引用的入口點都會在規則編譯期間被自動識別和創建。比如:

1
2
3
4
5
6
7
rule "authorize withdraw"
when
WithdrawRequest($ai : accountId,$am : amount ) from entry-point "ATM Stream"
CheckingAccount( accountId ==$ai, balance >$am )
then
// authorize withdraw
end

規則編譯器會識別"ATM Stream"入口點,並在規則庫中創建該入口點。

  • 使用入口點

    舉例如下:

1
2
3
4
5
6
7
// create your rulebase and your session as usual
StatefulKnowledgeSession session = ...
// get a reference to the entry point
WorkingMemoryEntryPoint atmStream =
session.getWorkingMemoryEntryPoint( "ATM Stream" );
// and start inserting your facts into the entry point
atmStream.insert( aWithdrawRequest );

除了這種手工插入事實的方式之外,Drools還提供了一系列的管道API和適配器,可以將其他流(如JMS、IO流、Socket等)之間接入到入口點上。

滑動窗口

在流模式中,規則的LHS部分
可以使用滑動窗口限定只關注一定范圍內的事件。這個范圍可以是時間或事件的個數,分別成為滑動時間窗口和滑動長度窗口。

比如:

1
2
3
4
5
6
7
8
9
10
11
StockTick() over window:time( 2m )

Number( doubleValue >$max ) from accumulate(
SensorReading($temp : temperature ) over window:time( 10m ), average($temp )
)

StockTick( company == "IBM" ) over window:length( 10 )

Number( doubleValue >$max ) from accumulate(
SensorReading($temp : temperature ) over window:length( 100 ), average($temp )
)

內存管理

在流模式下,引擎自動執行事件的內存管理。對於不可能再被匹配的事件自動釋放。

引擎會關注事件的@expires中指定的到期時間,並分析規則中隱含的到期時間,進行自動釋放。

原文地址:http://holbrook.github.io/2013/12/22/from_rule_to_cep.html
</div>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM