4

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

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

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

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

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

4

2 回答 2

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

于 2013-11-25T20:24:51.463 回答
1

检查 rxmarbles 示例代码。

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

据我了解,您应该能够对其进行调整以适合您的用例

于 2014-09-25T22:00:17.313 回答