Storm KafkaSpout如何知道所有螺栓都已执行

时间:2018-07-23 07:38:00

标签: apache-kafka apache-storm kafka-consumer-api

我的拓扑代码示例如下:

builder.setSpout("spout", new KafkaSpout);
builder.setBolt("bolt1", new Bolt1).shuffleGrouping("spout");
builder.setBolt("bolt2", new Bolt2).shuffleGrouping("bolt1");
builder.setBolt("bolt3", new Bolt3).shuffleGrouping("bolt2");

发出bolt1时,该消息将自动确认。但是,当bolt2或bolt3发生异常时,此消息将无法重新发送,如何检索失败的消息?

1 个答案:

答案 0 :(得分:0)

风暴具有tuple trees的概念。让我尝试使用问题中提供的示例进行解释。

当您的spout调用collector.emit方法时,新发出的元组(我们称为tuple1)被添加到tuple tree中。该元组已订阅bolt1,到达spout,并将接收从tuple1发出的数据。一旦它在execute方法中接收到tuple2作为输入,在处理了输入之后,将发出一个新值tuple1,该新值将被添加到execute之后的元组树中。在退出collector.ack方法之前,通过隐式调用tuple1来确认元组,这会告诉风暴tuple2已被处理,请从元组树中将其删除,然后保留bolt2传递给bolt1进行处理。

现在出现了一个问题,如果$("body").on("click", "#btnEdit", function (e) { TransactionId = $(this).closest("div").find('#SearchItemID').text(); EditorDuplicate(TransactionId); }); $("body").on("click", "#btnDuplicate", function (e) { TransactionId = $(this).closest("div").find('#SearchItemID').text(); EditorDuplicate(TransactionId); GetnextItemCode(); }) 由于某种原因无法确认会发生什么。 Storm将看到在一段时间(即拓扑超时时间)(默认为30s)之后,元组树还没有耗尽,因此它将从头开始重播元组,并且将执行与上述相同的过程。

希望我能够解释失败时会发生什么。有关更多详细信息,请阅读this或观看this