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

使用RxJS处理业务事件的复杂事件,rxjs,complex-event-processing,Rxjs,Complex Event Processing,我有一个web应用程序生成的商业事件数据库。 我想编写一个JavaScript应用程序,它将接收这些事件(最多几百个),并使用复杂的事件处理将在其中找到一些模式 例如,如果我们在15分钟内发生了登录失败事件,而没有发生登录事件,那么我们希望了解它。我们使用会话ID关联事件 我更喜欢使用exist库,因为我认为它是正确的工具。 我的问题是如何使用原始事件的时间戳而不是当前计算机时间来构建事件流 我看到RxJS有时间操作符,但看起来它使用的是当前时间 更新1 我发现了一个类,它看起来是一个很好的方向

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

例如,如果我们在15分钟内发生了登录失败事件,而没有发生登录事件,那么我们希望了解它。我们使用会话ID关联事件

我更喜欢使用exist库,因为我认为它是正确的工具。
我的问题是如何使用原始事件的时间戳而不是当前计算机时间来构建事件流

我看到RxJS有时间操作符,但看起来它使用的是当前时间

更新1

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

大概,您应该能够按照时间戳对现有事件进行排序,以确定它们发生的时间,并将其与未来的事件合并(因为它们显然已经被排序了)。之后,您可以以相同的方式处理事件

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

检查rxmarbles示例代码

特别是:它使用Rx.VirtualTimeScheduler


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

,因为这些事件已经发生,并且您很可能打算将此查询作为一次性交易运行,我怀疑Rx(或任何可观察的)是您想要的方式。使用Ix(交互式扩展)将带来更多好处,因为您要查询的事件已经存在。此外,您运行在什么环境中?可能有更好的方法来进行这种查询。例如,您最好使用一个简单的db查询。是否有必要像使用RxJS(没有查询提供程序)那样将所有结果都拉入内存?最后,出于前面提到的原因,我相信调度器与此逻辑几乎没有任何关系。调度程序控制处理事件/通知的时间和地点,并不用于指示处理数据的时间。事实上,每个事件的时间戳都应该存储在您的数据库中。我理解并同意。我认为使用Rx查询exist事件应该很容易,显然我错了。在观看和阅读有关Rx的文章时,我了解到他们使用虚拟调度器进行测试,这似乎是一种重新运行exist事件的好方法,就好像它们真的在发生一样。最后一件事是,如果这个系统存在,把它变成实时处理器应该和改变输入一样简单,是吗?啊,我明白你的意思了。实际上,如果您想这样做,我建议您使用事件的实际时间戳(而不是系统时间或调度程序时间)作为逻辑。因为时间戳已经存在(如果没有,你不能使用Rx来获得过去事件的准确时间戳),你可以直接使用它。。。你不需要调度器之类的东西。只需按时间对事件进行排序,然后再进行让步。托马斯,似乎链接已断开