storm的处理消息失败(可靠性原理)

转载:https://www.cnblogs.com/Jack47/p/guaranteeing-message-processing-in-storm.html
本文只是对原文的简单概述和摘要

如果消息未处理完,或者发生异常,storm支持重新处理未被处理的消息

如果想利用Storm的可靠性,需要做两件事:

  1. 创建一个元组时(消息树上创建一个新节点)需要通知Storm
  2. 处理完一个元组,需要通知Storm
元组创建时通知Storm

在Storm消息树(元组树)中添加一个子结点的操作叫做锚定(anchoring)。在应用程序发送一个新元组时候,Storm会在幕后做锚定。

_collector.emit(tuple, new Values(word));代表锚定了
_collector.emit(new Values(word));代表未锚定,storm就无法跟踪这个消息,也就无法提供可靠性

多锚定

List anchors = new ArrayList();
anchors.add(tuple1);  
anchors.add(tuple2);
_collector.emit(anchors, new Values(word));

做流的合并或者聚合的时候非常有用。一个多锚定的元组处理失败,会导致Spout上重新处理对应的多个输入元组。

元组处理完后通知Storm

通知是通过OutputCollector中的ack和fail函数来完成的

一个Storm拓扑有一组特殊的"acker"任务,它们负责跟踪由每个Spout元组触发的消息的处理状态。

可以通过拓扑配置项Config.TOPOLOGY_ACKER_EXECUTORS来设置一个拓扑中acker任务executor的数量。Storm默认TOPOLOGY_ACKER_EXECUTORS和拓扑中配置的Worker的数量相同

有三种方法来去掉可靠性:

设置Config.TOPOLOGY_ACKERS为0。这种情况下,Storm会在Spout吐出一个元组后立马调用Spout的ack函数。这个元组树不会被跟踪。
当产生一个新元组调用emit函数的时候通过忽略消息message-id参数来关闭这个元组的跟踪机制。
如果你不关心某一类特定的元组处理失败的情况,可以在调用emit的时候不要使用锚定。由于它们没有被锚定到某个Spout元组上,所以当它们没有被成功处理,不会导致Spout元组处理失败。

你可能感兴趣的:(storm的处理消息失败(可靠性原理))