Storm的可靠性如何实现?包括spout和bolt两部分

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。


bolt可靠性:
    bolt要实现可靠的消息处理机制包含两个步骤:
    1.当发射衍生的tuple时,需要锚定读入的tuple。
    2.当处理消息成功或者失败时分别确认应答或者报错。
     
    锚定一个tuple的意思是,建立读入tuple和衍生出的tuple之间的对应关系,这样下游的bolt就可以通过应答确认、报错或超时来加入到tuple树结构中。

    非锚定的tuple不会对数据流的可靠性起作用。如果一个非锚定的tuple在下游处理失败,原始的根tuple不会重新发送。

猜你喜欢

转载自my.oschina.net/134596/blog/1798087