【问题标题】:Apache Storm aggregation rules for missing expected events in rolling time-periodApache Storm 聚合规则,用于在滚动时间段内丢失预期事件
【发布时间】:2015-09-26 18:20:58
【问题描述】:

我的用例是实时识别在 X 时间后未收到预期事件的实体,而不是使用批处理作业。例如:

如果我们在时间 T 收到了 PaymentInitiated 事件,但在 T+X 之前没有收到 PaymentFailed / PaymentAborted / PaymentSucedded 中的任何一个,则引发一个触发器,说明 PaymentStuck 以及 PaymentIntitiated 事件的详细信息。

如何在 Apache Storm 中为此类用例建模,因为它在每个事件上滚动时间段 X,而不是固定时间间隔。

谢谢, 哈里什

【问题讨论】:

    标签: real-time distributed-computing complex-event-processing apache-storm apache-samza


    【解决方案1】:

    对于 Storm,需要使用低级 Java API 将所有逻辑放入 UDF 代码中(我怀疑 Trindent 是否有用)。我从未与 Samza 合作过,因此无法为它提供任何帮助(或判断哪个系统更适合您的问题)。

    例如,在 Storm 中,您可以为 Spout.nextTuple() 中的每个元组分配一个时间戳,并按时间戳的降序缓冲 Bolt 内的所有未完成支付的元组。每次调用Bolt.execute() 时,您都可以将新元组的时间戳与队列的头部(即最旧的元组)进行比较。如果输入元组的时间戳大于 head-T 加 X,则您知道您的 head 元组超时,您可以为它提高触发器。

    当然,你需要做fieldsGrouping()来保证属于同一个支付的所有元组都被同一个Bolt实例处理。您可能还需要按时间戳对传入的螺栓元组进行某种程度的排序,或者使用更高级的超时逻辑来处理无序的元组(关于增加时间戳)。

    根据您的延迟要求和输入流速率,您还可以使用“tick tuples”来触发头元组与这个虚拟滴答元组的比较。或者作为更严格的实现,直接在 Spout.next() 中执行所有这些逻辑(如果您知道付款的所有元组都通过同一个 Spout 实例)。

    【讨论】:

    • 感谢您的回复。在上述方法中,只有在调用 Bolt.execute() 时才会检查时间戳,这只会在事件上完成。但是我的要求是即使缺少所需的事件也要提高触发器......如何处理这种情况?我是不是误会了什么?
    • 你明白了。这个想法是在另一个更年轻的事件(即,在付款的潜在最后事件之后)进入时触发触发器。如果您有按时间戳排序的元组,您知道最后一个事件确实丢失了(即,您间接反应)。您将永远无法直接对丢失的事件做出反应,因为没有任何反应。
    猜你喜欢
    • 1970-01-01
    • 2011-09-17
    • 2021-03-17
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    相关资源
    最近更新 更多