组件
概要
组件是指在Storm中用来发送、响应消息的对象,表现为Storm数据流图中的节点。在Storm项目的具体实现中,这些组件继承或者实现与IComponent、Spout、Bolt相关的接口或者类。
IComponent
IComponent接口主要定义了所有Topology各个组件可能使用的共同方法。具体定义如下。
public interface IComponent extends Serializable {
//声明消息输出方式,联系Declarer
void declareOutputFields(OutputFieldsDeclarer declarer);
//声明(定义)并返回配置Config实例
Map<String, Object> getComponentConfiguration();
}
BaseComponent是IComponent是一个虚类,定义如下。
public abstract class BaseComponent implements IComponent {
@Override
public Map<String, Object> getComponentConfiguration() {
return null;
}
}
Spout
Spout即消息源,可以自发生成消息,也可以从外部接收信息,例如Kafka。Spout相关接口和类的关系图如下。
从上图不难看出,ISpout是核心接口,其函数所负责实现的功能如下。
- void open(Map conf, TopologyContext context, SpoutOutputCollector collector) 当一个ISpout任务启动的时候,使用该函数初始化运行环境
- void close() 当ISpout关闭时调用该函数,清理现场
- void activate() 状态切换函数,激活ISpout,调用该函数后,将会调用NextTuple()函数
- void deactivate() 状态切换函数,失活ISpout
- void nextTuple() 关键运行函数,调用该函数时向外发送消息
- void ack(Object msgId) 确认发送的msgId消息已经成功发送
- void fail(Object msgId) 确认所发送的msgId消息发送失败,可能进行再次发送
需要注意的是,nextTuple(),ack()和fail() 函数是运行在同一个线程中的,因此nextTuple()是非阻塞的,当没有消息发送时立即返回。
IRichSpout同时继承了ISpout和IComponent接口,BaseComponent是实现ICompont的虚类,BaseRichSpout实现IRichSpout、继承BaseComponent。IRichSpout和BaseRichSpout不同之处是IRichSpout用户可以自定义所有的函数,灵活性更高,BaseRichSpout则只需要实现部分函数,一些函数已经实现,使用起来更简单。
Bolt
Bolt即消息处理组件,接收来自上游的消息,进行处理后给出结果或者将消息发送出去。与Bolt相关的接口和类的关系图如下。
Bolt是Storm中基础运行单位,当Task启动时,使用prepare()函数初始化运行时环境,调用execute()函数接收Tuple进行处理,当Task结束时,使用cleanup()函数销毁对象。
IRichBolt是最常用的接口,一般使用IRichBolt定义Bolt。相对IRichBolt而言,BaseRichBolt使用较简单,但灵活性略微降低,类似于IRichSpout和BaseRichSpout的关系。IBatchBolt用来实现批处理。
IBatchBolt主要用于Storm中的批处理,批处理相比较单一的消息处理更为高效。Storm的事务Topology和Trident主要基于IBatchBolt。
BaseStatefulBoltExecutor (待续。。。)