ApacheStorm:通过唯一id跟踪元组,从源喷口到最后一个螺栓

b4qexyjb  于 2021-06-21  发布在  Storm
关注(0)|答案(2)|浏览(376)

我想要一种在整个storm拓扑中唯一标识元组的方法,这样每个元组都可以从喷口到最后一个螺栓进行跟踪。
我的理解是,当传递一个唯一的消息id时,带有一个从喷口发出的消息,例如:

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

当确认到喷口时,以某种方式返回该id(是否可以更早地进行模拟以在任何时候返回传递的id?)。但是在元组上使用get message id例如:

inputTuple.getMessageId()

这将返回一个新的messageid,而不是元组生成的喷口处传入的messageid。参考https://groups.google.com/forum/#!主题/storm用户/xbeqmda rzs
问题
1) 有没有一种方法可以在收集器发出tuple时获取tuple.getmessageid()。
2) 或者,是否可以通过某种方式从Topology中任何喷口或螺栓处的元组获取在喷口处传递的消息ID?
最终解决方案我希望能够在元组发出时设置其id,然后能够在storm拓扑中的任何点再次识别该元组。
或者我的系统跟踪的唯一messageid必须作为字段/值传递到每个喷口和螺栓的每个输出上。
谢谢

p5cysglq

p5cysglq1#

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

z8dt9xmd

z8dt9xmd2#

这个答案有几个部分。首先,正如您正确指出的,由您来为您发出的每个元组在您的喷口中提供一个唯一的id。第二,如果您想在拓扑中的任何地方访问该id,那么将该id添加到喷口发出的复合元组中。第三(只是为了完整性),如果在处理saut中的ack或fail时,在发出的元组中有什么您需要知道的,那么将这些信息添加为组成消息id的复合值的一部分。
举个例子,当从喷口发出元组时,我通常也使用元组本身作为消息id:

outputCollector.emit(myTuple, myTuple);

这可能有点过分,但至少我可以在任何地方访问元组中的所有信息。

相关问题