spout端:
在图中,实线部分表示从spout发射的原始主干tuple,虚线部分表示的子tuple都是源自于原始tuple。这样产生的图形叫作tuple树,在有保障数据的处理过程当中,bolt每收到一个tuple,都须要向上游确认应答(ack)或报错。对主干tuple中的一个tuple,若是tuple树上的每一个bolt进行了确认应答,spout会调用ack方法来标明这条信息已经彻底处理了。若是树中的任何一个bolt处理tuple报错,或者处理超时,spout会调用fail方法。
Storm的ISpout接口定义了三个可靠性相关的API:nextTuple,ack和fail。
前面讲过,Storm经过调用Spout的nextTuple()发送一个tuple。为实现可靠的消息处理,首先要给每一个发出的tuple带上惟一的ID,而且将ID做为参数传递SpoutOutputCollector的emit()方法: collector.emit(new Values("value1", "value2"), msgId);
给tuple指定ID告诉Storm系统,不管执行成功仍是失败,spout都要接收tuple树上全部节点返回的通知。若是处理成功,spout的ack()方法将会对编号是ID的消息应答确认,若是执行失败或者超时,会调用fail()方法。
Fail方法即重发失败的tuple。orm
bolt可靠性:
bolt要实现可靠的消息处理机制包含两个步骤:
1.当发射衍生的tuple时,须要锚定读入的tuple。
2.当处理消息成功或者失败时分别确认应答或者报错。
锚定一个tuple的意思是,创建读入tuple和衍生出的tuple之间的对应关系,这样下游的bolt就能够经过应答确认、报错或超时来加入到tuple树结构中。接口
非锚定的tuple不会对数据流的可靠性起做用。若是一个非锚定的tuple在下游处理失败,原始的根tuple不会从新发送。it