有什么方法可以在 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"));
}
}
我希望 TimingBolt
和 AggregateBolt
之外的螺栓可以超出 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 直接配置第二个螺栓。
由于在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"));
}
}
我希望 TimingBolt
和 AggregateBolt
之外的螺栓可以超出 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 直接配置第二个螺栓。