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

标签: storm 跟踪 消息 | 发表时间:2013-02-08 16:44 | 作者:旁观者
出处:http://www.cnblogs.com/zhengyun_ustc/

2012·2汇总

我们做 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 如何保证消息不丢失

赠图一枚:

本文链接

相关 [storm 跟踪 消息] 推荐:

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

- - 博客园_旁观者-郑昀
我们做 Notify Server 时可以间接借鉴这个解决方案的思路. Storm 是一个分布式的、容错的实时计算系统,由 Twitter 开源. 先不介绍术语和背景知识,直接来一些吸引眼球的内容:. 一,Tuple Tree. spout 发射一个消息(tuple),可能会导致成百上千的消息基于此消息被创建.

seq_trace集群消息链跟踪利器

- KnightE - Erlang非业余研究
原创文章,转载请注明: 转载自Erlang非业余研究. 本文链接地址: seq_trace集群消息链跟踪利器. 做过网络集群服务器的的同学都知道,集群服务通常由不同的服务器组成,这些不同角色的服务器组合在一起共同完成了特定的服务. 一个服务通常需要一个协调者,和不同的工作者. 协调者负责派发任务,接收工作者的完成情况,最终回馈给用户.

storm简介

- - 搜索技术博客-淘宝
伴随着信息科技日新月异的发展,信息呈现出爆发式的膨胀,人们获取信息的途径也更加多样、更加便捷,同时对于信息的时效性要求也越来越高. 举个搜索场景中的例子,当一个卖家发布了一条宝贝信息时,他希望的当然是这个宝贝马上就可以被卖家搜索出来、点击、购买啦,相反,如果这个宝贝要等到第二天或者更久才可以被搜出来,估计这个大哥就要骂娘了.

Storm Trident 学习

- - 小火箭
Storm支持的三种语义:. 至少一次语义的Topology写法. 参考资料: Storm消息的可靠性保障 Storm提供了Acker的机制来保证数据至少被处理一次,是由编程人员决定是否使用这一特性,要使用这一特性需要:. 在Spout emit时添加一个MsgID,那么ack和fail方法将会被调用当Tuple被正确地处理了或发生了错误.

Storm实战之WordCount

- - 编程语言 - ITeye博客
 在全面介绍Storm之前,我们先通过一个简单的Demo让大家整体感受一下什么是Storm. 本地模式(Local Mode): 即Topology(相当于一个任务,后续会详细讲解)  运行在本地机器的单一JVM上,这个模式主要用来开发、调试. 远程模式(Remote Mode):在这个模式,我们把我们的Topology提交到集群,在这个模式中,Storm的所有组件都是线程安全的,因为它们都会运行在不同的Jvm或物理机器上,这个模式就是正式的生产模式.

storm常见问题解答

- - BlogJava-庄周梦蝶
    最近有朋友给我邮件问一些storm的问题,集中解答在这里. 一、我有一个数据文件,或者我有一个系统里面有数据,怎么导入storm做计算. 你需要实现一个Spout,Spout负责将数据emit到storm系统里,交给bolts计算. 怎么实现spout可以参考官方的kestrel spout实现:.

Storm 实时性分析

- - CSDN博客架构设计推荐文章
都说Storm是一个实时流处理系统,但Storm的实时性体现在什么方面呢. 首先有一个前提:这里的实时性和我们通常所说的实时系统(芯片+汇编或C编写的实时处理软件)的实时性肯定是没法比的,也不是同一个概念. 这里的实时性应该是一个相对的实时性(相对于Hadoop之类 ). 总结一下,Storm的实时性可能主要体现在:.

那些storm的坑坑

- - 开源软件 - ITeye博客
转载请声明出处:http://blackwing.iteye.com/blog/2147633. 在使用storm的过程中,感觉它还是不如hadoop那么成熟. 当然,它的流式处理能力挺让人眼前一亮,以前做的个性化推荐都是离线计算,现在总算把实时部分也加上了. 总结一下storm使用的些心得:. 1.尽量把大量数据处理行为分拆成多个处理component.

storm准实时应用

- - CSDN博客推荐文章
1 应用背景: 需要实时统计用户的登陆数,在线人数,活跃时间,下载等指标的数据,或者清洗后移到hdfs上.         1) 客户端产生数据---.         2) kafka-生产者实时采集数据(保留7天)-----.         3) storm实时消费数据,处理数据.         4)把实时数据统计结果缓存到memcached 中.

Storm核心概念剖析

- - 互联网 - ITeye博客
最近团队中有分析的场景,用到了JStorm来做数据的实时分析,于是花时间对于一些概念做了了解. 这个的话出来应该有几年时间了,阿里巴巴也重写了一套JStorm,核心的类名都是服用的Storm的,他是一套实时数据处理系统,容错行好,然后足够稳定,目前很多数据实时分析的场景,选择Storm的越来越多了.