有没有办法在Storm bolt的一部分中确认元组

时间:2015-06-08 08:01:54

标签: apache-storm

因为在我的拓扑的整个组件中查找Storm中的所有消息是低效的,所以只有其中一些需要保证消息处理,并且我想知道是否有正确的方法来执行此操作。

例如,我有一个TimingBolt,它使用tick元组使工作在特定周期内工作:

// TimingBolt
@Override
public void execute(Tuple input) {
    if (TupleUtils.isTick(input)) {
        collector.emit(streamA, input, new Values("Tick"));
    } else {
        collector.emit(streamB, new Values("Message"));
    }
}

我想保证在"Tick"

之后将TimingBolt消息明确发送一次到螺栓
// The AggregateBolt after TimingBolt
@Override
public void execute(Tuple input) {
    if (input.getString(0).equals("Tick")) {
        collector.emit(new Values("Get Tick"));
        collector.ack();
    } else {
        // do something else
        collector.emit(new Values("Not Tick"));
    }
}

我希望除TimingBoltAggregateBolt之外的其他螺栓可能超出ACK树的范围。

文档http://storm.apache.org/documentation/Guaranteeing-message-processing.html没有显示有关此事的任何内容。这是一个有效的场景,还是从spout开始ack是使acker工作的唯一方法?

1 个答案:

答案 0 :(得分:2)

你必须从鲸鱼喷水开始。

要明确的是,您不能保证使用所谓的“可靠拓扑”来传递消息。相反,你可以保证一个元组和它的所有“后代元组”都被完全传递和处理,或者会通知喷口故障。可以自动重新发送失败的消息,但最终会有一个小窗口,其中不再重试元组。为了使其工作,spout具有一些可靠的元组行为,螺栓不具备:(1)使用元组发出对象id的能力和(2)当元组最终成功或失败时使用该id调用的方法(分别为ack(id)和fail(id))。由于螺栓没有这些行为,因此无法从螺栓开始可靠的元组处理。

考虑使用TOPOLOGY_TICK_TUPLE_FREQ_SECS直接配置第二个螺栓。