转自 http://www.cnblogs.com/Jack47/p/guaranteeing-message-processing-in-storm.html
内容简介
Storm可以保证从Spout发出的每个消息都能被完全处理。Storm的可靠性机制是完全分布式的(distributed),可伸缩的(scalable),容错的(fault-tolerant)。本文介绍了Storm如何保证可靠性以及作为Storm使用者,我们需要怎么做,才能充分利用Storm的可靠性。理解一些实现细节,也能够帮助我们领悟Storm的设计理念。
PS:本文用到了Storm的一些基本概念,例如Bolt,任务(Task),元组(Tuple),如果不清楚这些概念,可以参看我之前写的文章:Storm介绍(一),理解Storm并发。下文中元组(Tuple),跟消息(message)是等价的,Storm中处理的消息是用元组这种数据结构来表示的。
一个消息被完整处理是什么意思?
流式计算单词个数的例子
考虑如下的流式计算文章中单词个数的拓扑:
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout(“sentences”, new KestrelSpout(“kestrel.backtype.com”, 22133, “sentence_queue”, new StringScheme()));
builder.setBolt(“split”, new SplitStentence(), 10).shuffleGrouping(“sentences”);
builder.setBolt(“count”, new WordCount(), 20).fieldsGrouping(“split”, new Fields(“word”));
这个拓扑由3个处理单元组成:一个叫”sentences”的Spout,负责从Kestrel队列中读取句子并作为新的Spout元组发送出去。名称为”split”的Bolt是Spout元组的下游消费方,它把接收到句子切分成单词并发送出去。名称为”count”的Bolt是”split” Bolt的下游消费方,它使用HashMap