有什么方法可以在 Storm 螺栓的一部分中确认元组

Is there any way to ACK tuples in a part of Storm bolts

由于在Storm中ack所有消息的效率很低,在我的拓扑的所有组件中,只有其中一些需要保证消息处理,我想知道是否有合适的方法来做到这一点。

例如,我有一个 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 工作的唯一方法?

你得从喷口说起。

需要说明的是,使用所谓的 "a reliable topology" 无法保证您的消息传递。相反,您可以保证元组及其所有 "descendant tuples" 已完全交付和处理,或者 spout 将收到失败通知。失败的消息可以自动重发,但最终有一个小window,其中一个元组不再重试。为了让它工作,spout 有一些可靠的元组行为,而 bolts 没有:(1) 能够使用元组发出对象 id 和 (2) 当元组最终成功或失败时使用该 id 调用的方法(分别是 ack(id) 和 fail(id))。由于螺栓没有这些行为,您无法从螺栓开始可靠的元组处理。

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