【问题标题】:Esper - handle out of order eventsEsper - 处理乱序事件
【发布时间】:2019-09-12 11:34:11
【问题描述】:

我想监控一个事件是否在事件到达后 10 分钟内没有到达相同的id

这是我目前使用的 EPL:

SELECT * FROM pattern[ 每 s=Order_Status(status="placed") -> (timer:interval(600 sec) 而不是 e=Order_Status(status="delivered", id=s.id ))]

通常placed 事件在delivered 之前到达,但有时由于我们系统中的一些滞后,delivered 事件恰好在placed 之前到达某些id

案例

  1. 时间:8:00 事件:Order_Status{id=167, status="placed"}
    时间:8:07 事件:Order_Status{id=167, status="delivered"}

    (10分钟内送达)

  2. 时间:8:00 事件:Order_Status{id=189, status="placed"}
    时间:8:17 事件:Order_Status{id=189, status="delivered"}

    (10分钟后送达)

  3. 时间:8:00 事件:Order_Status{id=2637, status="delivered"}
    时间:8:08 事件:Order_Status{id=2637, status="placed"}

    (但不应该警报,问题是iddelivered 事件在placed 之前到达)

如上所述,当 EPL 模式在 placed 事件之后启动窗口并等待已经到达的 delivered 事件时,我会收到错误警报。

如何处理这种乱序事件的情况?

注意: (基本上,如果placeddelivered 之间的时间差高于某个阈值,我想检查每个id。 我在每个事件中也有时间戳字段)

【问题讨论】:

    标签: complex-event-processing esper


    【解决方案1】:

    您的模式中有一个“非”,用于检测事件的缺失。您的要求不搜索缺席,因此“不”是不正确的。

    还有一个需求问题。您没有说明当有许多 A 事件而只有一个 B 事件时会发生什么。是否有许多匹配项或仅匹配最后一个 A 事件或第一个 A 事件或其他什么?

    示例模式:

    pattern [A -> (timer:interval(10 minutes) and B)]
    

    或者这是一个看起来符合你想要的连接:

    select * from B unidirectional, A#window(10 minutes)#lastevent
    

    “A#window(10 minutes)#lastevent”将最后一个事件保留长达 10 分钟。

    【讨论】:

    • 对不起,我的错,实际上我必须检测到没有事件,所以“不”在查询中很好。并且流中的标识符是id。所以我想检查给定的iddelivered 是否没有在placed 的 10 分钟内出现(对于相同的id)。在这种情况下我该如何处理乱序?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多