Storm 是如何跟踪一条消息以及它衍生出来的消息都被成功处理的

2012·2汇总 html

咱们作 Notify Server 时能够间接借鉴这个解决方案的思路。
 
Storm 是一个分布式的、容错的实时计算系统,由 Twitter 开源。
先不介绍术语和背景知识,直接来一些吸引眼球的内容:
 
一,Tuple Tree
spout 发射一个消息(tuple),可能会致使成百上千的消息基于此消息被建立。这些消息构成一个树状结构,咱们称之为“tuple tree”。
tuple 是如何被跟踪的呢?系统中有成千上万的消息,若是为每一个 spout 发送的消息都构建一棵树的话,很快内存就会耗尽。因此,必须采用不一样的策略来跟踪每一个消息。
 
二,Acker 跟踪 Tuple
acker 对于 tuple 的跟踪算法是 storm 最大的突破。这个算法使得 对于任意大的一个 tuple tree, 它只须要恒定的20字节就能够进行跟踪了
 
Storm 系统中有一组叫作“acker”的特殊任务,它们负责跟踪 DAG(有向无环图)中的每一个消息。每当发现一个 DAG 被彻底处理,它就向建立这个根消息的 spout 任务发送一个信号。
原理很简单:
1)当一个消息被建立的时候(不管是在 spout 仍是 bolt 中),系统都为该消息分配一个 64bit 的随机值做为id。这些 messageid 是 acker 用来跟踪由 spout 消息派生出来的 tuple tree 的。
2)acker 对于每一个 tuple 保存一个 ack-val 的校验值(一个64 bit数字),它的初始值是0。 而后每发射一个 tuple (即消息的建立),或者 ack 一个 tuple (即消息的被应答),那么 tuple 的 id 都要跟 ack-val 异或一下,而且把获得的值更新为 ack-val 的新值。假设每一个发射出去的 tuple 都被 ack 了, 那么最后 ack-val 必定是0(由于一个数字跟本身异或获得的值是0)。
 
总的来讲, ack-val 是这棵树上全部建立的 tuple-id 以及 ack 的 tuple-id 一块儿异或(XOR)。ack-val 表示了整棵树的的状态,不管这棵树多大,只须要这个固定大小的数字就能够跟踪整棵树。
每当 acker 发现一棵树的 ack val 值为0时,它就知道这棵树已经被彻底处理了
由于消息的随机ID是一个64bit的值,所以ack val在树处理完以前被置为0的几率很是小。
 
三,Acker 有不少,选择哪个呢?
当一个 tuple 须要 ack 的时候,它到底选择哪一个 acker 来发送这个信息呢?
storm   用一致性哈希来把一个 tuple-message-id 对应到 acker  , 由于每个 tuple 知道它全部的祖宗的 tuple-message-id, 因此它天然能够算出要通知哪一个 acker 来 ack。
 
参考资源:
1)2011,徐明明, Storm翻译稿系列
2)2013,量子统计,Storm入门教程 第四章第五章
3)2011,徐明明, Storm 如何保证消息不丢失
赠图一枚:
相关文章
相关标签/搜索