基本概念的解析分布式
对于Storm,有一个相对比较重要的概念就是 "Guarantee no data loss" -- 可靠性spa
很明显,要作到这个特性,必需要tracker 每个data的去向和结果,Storm是如何作到的orm
-》 那就是咱们接下来要说的 Acker 机制,先归纳下Acker所参与的工做流程生命周期
1 Spout 建立一个新的Tuple时候,会发射一个消息通知acker去跟踪;文档
2 Bolt 在处理Tuple成功或者失败的时候,也会发送一个消息通知Acker工作流
3 Acker会好到发射该Tuple的Spout,回掉其Ack ,fail方法效率
一个tuple被彻底处理的意思是:
方法
这个tuple以及由这个tuple后续所致使的全部tuple 都被成功的处理, 而一个tuple会被认为处理失败了,若是这个im
消息在timeout所指定的时间内没有成功处理top
也就是说对于任何一个Spout-tuple以及它的子孙,到底处理成功失败与否,咱们都会获得通知
由一个tuple产生一个新的tuple称为:anchoring,你发射一个tuple的同时也就完成了一次anchoring
Storm 里面有一类特殊的task称为:acker,请注意,Acker也是属于一种task,若是您对Task还不够熟悉,请参考另外的一篇文档:有关Storm-executor-task的关系,acker负责跟踪spout发出的每个tuple的tuple树,当Acker发现一个tuple树已经处理完成了,它就会发送一个消息给产生这个tuple的task。
Acker task 组件来设置一个topology里面的acker的数量,默认值是一,若是你的topoogy里面的tuple比较多的话,那么请把acker的数量设置多一点,效率会更高一点。
理解Storm的可靠性的办法是看看 tuple,tuple树的生命周期,当一个tuple被建立,无论是Spout 和bolt 建立的,他被赋予一个位的ID,而acker就是利用这个ID 去跟踪全部的tuple的。每个tuple知他祖宗的iD,吐过Stomr检测到一个tuple被彻底处理了,那么Storm会以最开始的那个message-id 做为参数去调用消息源头的ACk方法,反之Storm会调用Spout的fail方法,
值得注意的一点是Storm调用Ack或则fail的task始终是产生这个tuple的那个task,因此若是一个Spout,被分为不少个task来执行,消息执行的成功失败与否始终会通知最开始发出tuple的那个task
做为Storm的使用者,有两件事情要作以更好的利用Storm的可靠性特征,首先你在生成一个tuple的时候要通知Storm,其次,彻底处理一个tuple以后要通知Storm,这样Storm就能够检测到整个tuple树有没有完成处理,而且通知源Spout处理结果
1 因为对应的task挂掉了,一个tuple没有被Ack:
Storm的超时机制在超时以后会把这个tuple标记为失败,从而能够从新处理
2 Acker挂掉了: 在这种状况下,由这个Acker所跟踪的全部spout tuple都会出现超时,也会被从新的处理
3 Spout 挂掉了:在这种状况下给Spout发送消息的消息源负责从新发送这些消息
三个基本的机制,保证了Storm的彻底分布式,可伸缩的而且高度容错的。