Apache Storm:通过Source Spout到Final Bolt

时间:2015-07-19 15:48:51

标签: java messaging apache-storm fault-tolerance

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

我理解的方式是传递一个唯一的消息ID,其中包含来自喷口的发射,例如:

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

这个ID在以某种方式返回到spout(这可以在之前模拟以在任何时候取回传递的Id?)。但是在元组上使用get message id例如:

inputTuple.getMessageId()

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

问题

1)当收集器发出元组时,有没有办法获取tuple.getMessageId()。

2)或者可以在toplogy中的任何一个spout或bolt中从元组以某种方式获取在spout中传入的messageId?

结束解决方案 我希望能够在元组发出时在元组上设置ID,然后能够在Storm拓扑中的任何位置再次识别该元组。

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

由于

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

这个答案的几个部分。首先,正如您正确指出的那样,您可以为您发出的每个元组在您的喷口中找到一个唯一的ID。其次,如果要在拓扑中的任何位置访问该ID,请将该ID添加到Spout发出的复合元组中。第三个(仅为完整性),如果在处理确认或者Spout中的故障时您需要知道发射元组中的任何内容,则将该信息作为构成消息ID的复合值的一部分添加。

作为一个例子,当从一个喷口发出一个元组时,我通常也会使用Tuple本身作为消息ID:

outputCollector.emit(myTuple, myTuple);

这可能有点矫枉过正,但至少我可以随处访问元组中的所有信息。