关于Storm 0.9.4/0.9.5可靠性机制的技术疑问
Storm 0.9.4/0.9.5 可靠性机制疑问解答
针对你提到的Storm 0.9.4和0.9.5版本的两个可靠性机制问题,我结合早期Storm的核心设计逻辑和社区实践经验来解答:
1. 对未锚定的tuple调用ack()或fail()是否有实际作用?
在Storm 0.9.x系列(包括0.9.4、0.9.5)中,未锚定(unanchored)的tuple不属于拓扑的消息追踪树结构,所以调用ack()或fail()本质上是无操作(no-op)。
Storm的可靠性机制核心是通过锚定(anchoring)来构建消息链,Spout只会追踪那些被锚定关联的消息状态。未锚定的tuple不会被Spout纳入追踪范围,因此这些ack/fail调用既不会触发Spout的消息重试逻辑,也不会影响拓扑的消息超时统计。
2. 直接接收Spout发射tuple的Bolt是否需要执行ack或fail操作?
这个问题要结合你提到的Spout发射方法来判断:
你说Spout使用的是public List<Integer> emit(List<Object>...方法(不带消息ID的发射方式),这种发射方式意味着Spout本身没有开启消息追踪——只有当Spout使用带消息ID的重载方法(比如emit(List<Object> tuple, Object msgId))时,才会记录需要追踪的消息并等待下游的ack/fail反馈。
因此,在你描述的场景下,直接接收这些tuple的Bolt不需要执行ack或fail操作,因为Spout根本没有在等待这些消息的状态反馈,即使调用了ack/fail也不会产生任何实际效果。
内容的提问来源于stack exchange,提问作者user3763284
相关产品推荐
相关产品推荐

