Storm【技术文档】 - Storm的Acker机制


基本概念的解析分布式

对于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的使用者,有两件事情要作以更好的利用Storm的可靠性特征,首先你在生成一个tuple的时候要通知Storm,其次,彻底处理一个tuple以后要通知Storm,这样Storm就能够检测到整个tuple树有没有完成处理,而且通知源Spout处理结果


1  因为对应的task挂掉了,一个tuple没有被Ack:

    Storm的超时机制在超时以后会把这个tuple标记为失败,从而能够从新处理


2 Acker挂掉了: 在这种状况下,由这个Acker所跟踪的全部spout tuple都会出现超时,也会被从新的处理


3 Spout 挂掉了:在这种状况下给Spout发送消息的消息源负责从新发送这些消息


三个基本的机制,保证了Storm的彻底分布式,可伸缩的而且高度容错的。

相关文章
相关标签/搜索