2013-01-09 109 views
6

我有一個連續的消息流被分析。分析返回不同的變量,如作者,主題,情緒,字數和一組不同的單詞。系統中的用戶可以定義規則,匹配時應該觸發警報。規則應該存儲在一個sql數據庫中。規則是來自消息分析的單個標準的聯合,即word-count > 15 && topic = 'StackOverflow' && sentiment > 2.0 && word-set contains 'great'。每個允許的規則標準都在消息分析結束時提供,隨後將觸發規則驗證並在Java中實施規則驗證。連續規則匹配的模式

每個消息都必須檢查系統中所有用戶定義的所有規則,這佔用了大量的計算能力(目前每秒超過10條消息,並且會有10,000條規則需要檢查)。有沒有一種常見的模式來加速匹配過程,也許這樣的規則可以平行檢查,除了一個接一個嗎?是否可以在純SQL中執行此操作,不同類型規則的模式將如何顯示?

+0

SQL通常用於關係數據庫。這個系統中的關係數據庫在哪裏? –

+0

哪些規則存儲,由用戶定義? – sourcecode

+0

每條消息是否包含解決任何/所有規則所需的所有字段? –

回答

2

您的考慮可能不僅僅是匹配的吞吐量。例如,您需要維護規則。

但是,讓我們假設一組靜態規則和消息,其中包含滿足所有規則所需的所有字段。使用SQL,結構將以message表開始。該表格將具有insert觸發器。插入觸發器將負責匹配規則。做這個的最好方式是什麼?

即使每個匹配都是單線程的,每秒處理超過10條消息,處理過程本質上也是並行的。我不知道你需要多少努力才能平行比賽。數據庫中的並行性通常在SQL語句中,而不是在它們之間。

有各種解決方案。例如,您可以將規則編碼爲巨型存儲過程中的代碼。這將是一場噩夢,可能會超過存儲過程的長度限制,並且可能會非常緩慢。

另一個瘋狂的想法。將規則的匹配消息存儲在表中,用於該規則,並且具有約束條件僅加載匹配的規則。你的過程看起來像是一個zillion插入語句。

更嚴重的是,你會進一步走代碼,如:

select * 
from rules 
where . . . 

的結果集將有匹配規則。該where條款可能是這樣的:

select * 
from rules r 
where @wordcount > coalesce(r.wordcount, 0) and 
     @topic = coalesce(r.topic, @topic) and 
     . . . 

也就是說,所有的規則每一個可能的比較將是where子句。而且,這些規則將被預先處理以確定他們需要哪些條款。

你甚至可以與外部變量分配,並直接訪問查詢:

select * 
from rules r cross join inserted i 
where i.wordcount > coalesce(r.wordcount, 0) and 
     i.topic = coalesce(r.topic, @topic) and 
     . . . 

所以,是的,這是SQL可行的。而且,您可以並行進行匹配。你只需要做一些工作,讓你的規則適合數據庫比較的格式。

+0

感謝這些建議,最大的問題在於實際上將規則適用於通用數據庫格式,因爲它們本質上可能非常不同(不同的操作符,數值或用於比較的集合等)。 – Thomas

+0

@Thomas。 。 。這就是顧問存在的原因。 –

1

我已經在C#中解決了一個類似的問題,雖然沒有使用SQL。

爲了便於攜帶,我將規則作爲序列化XML存儲在數據庫中。

在應用程序啓動時,或者當規則表發生變化時(強制規則緩存刷新),我從數據庫加載所有規則,並將它們反序列化爲相應的類。

然後,隨着每個應用程序服務器上的數據傳入,我針對傳入數據執行規則併爲傳遞的規則執行適當的操作。 (當時我在應用程序服務器上執行proc中的操作,但現在我將它轉儲到隊列中。)

這具有在應用程序集羣之間分散計算的優點,並且不會保留所有內容吸收數據庫機器上的週期。