因为在我的拓扑的整个组件中查找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"));
}
}
我希望除TimingBolt
和AggregateBolt
之外的其他螺栓可能超出ACK
树的范围。
文档http://storm.apache.org/documentation/Guaranteeing-message-processing.html没有显示有关此事的任何内容。这是一个有效的场景,还是从spout开始ack是使acker工作的唯一方法?
答案 0 :(得分:2)
你必须从鲸鱼喷水开始。
要明确的是,您不能保证使用所谓的“可靠拓扑”来传递消息。相反,你可以保证一个元组和它的所有“后代元组”都被完全传递和处理,或者会通知喷口故障。可以自动重新发送失败的消息,但最终会有一个小窗口,其中不再重试元组。为了使其工作,spout具有一些可靠的元组行为,螺栓不具备:(1)使用元组发出对象id的能力和(2)当元组最终成功或失败时使用该id调用的方法(分别为ack(id)和fail(id))。由于螺栓没有这些行为,因此无法从螺栓开始可靠的元组处理。
考虑使用TOPOLOGY_TICK_TUPLE_FREQ_SECS直接配置第二个螺栓。