2013-11-03 93 views
4

我有一個我們的Web應用程序生成的業務事件數據庫。
我想編寫將採用這些事件(最多幾百個)的JavaScript應用程序,並且使用複雜事件處理將會在其中找到一些模式。使用RxJS處理業務事件的複雜事件

例如,如果我們在15分鐘內沒有登錄事件發生登錄失敗事件,我們想知道它。我們使用會話ID關聯事件。

我更喜歡使用存在的庫,從我看到的RxJS似乎是正確的工具。
我的問題是如何使用原始事件的時間戳而不是當前計算機時間來構建事件流?

我看到RxJS有時間的操作符,但它看起來像使用當前時間。

更新1
我發現HistoricalScheduler類,它看起來像一個很好的方向,但沒有關於它的文件,我不知道它甚至在RxJS存在。

+0

由於這些事件已經發生了,你很可能要運行這個查詢作爲一次性的一種交易,我懷疑的Rx (或任何一種可觀察的)就是你想要去的方式。由於您想要查詢的事件已經存在,因此會使用Ix(交互式擴展)更多。 –

+0

此外,你在哪個環境中跑步?做這種查詢可能有更好的方法。例如,使用簡單的數據庫查詢可能會更好。是否有一個原因需要將所有結果放入內存中,因爲使用RxJS(沒有查詢提供程序)會這樣做? –

+0

最後,由於前面提到的原因,我相信調度員對這個邏輯沒有什麼作用。調度程序控制何時何地處理事件/通知*,而不是用於指示何時處理數據*。事實上,每個事件的時間戳應該已經存儲在您的數據庫中。 –

回答

1

大概,你應該能夠根據時間戳對現有事件進行排序,以便將它們與未來事件合併(因爲它們顯然已被排序)。之後,您可以使用相同的方式處理事件。

var pastEvents = [ 
    { userId: 1, time: 100, status: 'failure' }, 
    { userId: 2, time: 400, status: 'success' }, 
    { userId: 1, time: 300, status: 'success' }, 
    { userId: 4, time: 200, status: 'success' }, 
    ] 
    .sort(function (a, b) { return b.time - a.time; }); 

var futureEvents = getFutureEventObservable(); 

var events = Rx.Observable.fromArray(pastEvents).merge(futureEvents); 

var groups = events.groupBy(function (x) { return x.userId; }); 

// do "complex event processing" here. 

不幸的是,如果該事件還沒有時間戳,該數據會丟失,和Rx有重現它的任何特殊方式。