2013-11-03 59 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有重现它的任何特殊方式。