我有一个kafka鲸鱼说法 KafkaSpout ,它从kafka主题中读取消息说 msg ,然后发出一个螺栓说 Bolt1 。 Bolt1 将此消息拆分为多条消息 msg1 , msg2 ,.., msgN 并向其他发送消息说 Bolt2 即可。现在,一旦 Bolt1 的所有消息 msg1 , msg2 ,.., msgN 被发送到 Bolt2 ,我需要对 msg 进行一些处理。有没有办法确定如果所有拆分消息都达到 Bolt2 ?
答案 0 :(得分:1)
通过Apache Storm'} Guaranteeing Message Processing文档页面,它会讨论如果正确发出,将生成一个元组树,如果消息丢失,Storm将从Spout重放。
这通过Storm调用锚定机制发生,比如你有以下执行方法。
public void execute(Tuple tuple) {
String sentence = tuple.getString(0);
for(String word: sentence.split(" ")) {
_collector.emit(tuple, new Values(word)); //anchoring happening
}
_collector.ack(tuple);
}
通过将输入元组指定为第一个来锚定每个单词元组 发射的参数。由于单词元组被锚定,鲸鱼喷口元组在 如果单词元组,将在以后重播树的根 未能在下游处理。 link
如果您在不包含原始元组的情况下发出新单词,
_collector.emit(new Values(word)); //no anchoring
以这种方式发出单词元组会导致它无法锚定。如果 下游处理元组失败,根元组不会 重播。 link