Apache Storm:通过唯一ID跟踪元组,从Source Spout到Final Bolt

per*_*kss 6 java messaging fault-tolerance apache-storm

我想要一种在整个Storm拓扑中唯一标识元组的方法,以便可以将每个元组从Spout跟踪到最终的Bolt。

我的理解方式是,例如,传递带有喷口发出的唯一消息ID时:

String msgID = UUID.randomUUID();
// emits a line from user tasks with msg id
outputCollector.emit(new Values(task), msgID);
Run Code Online (Sandbox Code Playgroud)

确认到喷口后,此ID会以某种方式返回(可以在任何时候更早模拟出来以获取通过的ID吗?)。但是,例如在元组上使用get message id:

inputTuple.getMessageId()
Run Code Online (Sandbox Code Playgroud)

这将返回一个新的messageId,而不是元组在Spout处传入的那个。参考https://groups.google.com/forum/#!topic/storm-user/xBEqMDa-RZs

问题

1)有一种方法可以在收集器发出Tuple时获取tuple.getMessageId()。

2)或者可以从拓扑中的任何喷嘴或螺栓的元组中以某种方式获得在喷嘴处传递的messageId吗?

最终解决方案 我希望能够在发出元组时在其上设置ID,然后能够在Storm拓扑中的任何时候再次标识该元组。

还是将必须将我的系统跟踪的唯一messageId作为字段/值传递到每个喷嘴和螺栓的每个输出上。

谢谢

Mat*_*Sax 3

无法在生产者处访问系统生成的 ID(只能在消费者处通过 访问)tuple.getMessageId()。为了按照您希望的方式跟踪元组,您需要(按照您自己的想法)将 ID 作为常规字段值添加到元组并将其在每个螺栓中复制到相应的输出元组。