0

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

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

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

谢谢, 哈里什

4

1 回答 1

1

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

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

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

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

于 2015-09-27T09:53:45.567 回答