使用RxJS进行业务事件的复杂事件处理

时间:2013-11-03 12:00:39

标签: rxjs complex-event-processing

我有一个Web应用程序生成的业务事件数据库 我想编写将接受这些事件(最多几百个)的JavaScript应用程序,并使用复杂事件处理将在其中找到一些模式。

例如,如果我们在15分钟内没有登录事件的登录失败事件,我们想知道它。我们使用会话ID关联事件。

我更喜欢使用现有的库,从我看到RxJS似乎是正确的工具 我的问题是如何使用原始事件的时间戳而不是当前的计算机时间来构建事件流?

我看到RxJS有时间运算符,但看起来它正在使用当前时间。

更新1
我发现HistoricalScheduler类似乎是一个很好的方向,但没有关于它的文档,我不确定它是否存在于RxJS中。

2 个答案:

答案 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没有特殊的方法来重现它。

答案 1 :(得分:1)

检查rxmarbles示例代码。

特别是:https://github.com/staltz/rxmarbles/blob/master/src/controllers/utils.coffee使用Rx.VirtualTimeScheduler。

根据我的理解,您应该能够根据您的用例进行调整