我正在尝试一种方案,其中我有一个Spout,它从Message Broker读取数据,并将消息作为元组发送到Bolt以进行某些处理。
Bolt post processing将其转换为单独的消息,并且每个子消息都必须发送到可以托管在不同计算机上的不同Broker。
假设我有有限的收件人(在我的情况下,有3个Message Brokers用于输出)。
因此,Bolt1后期处理可以直接将消息丢弃到这3个消息代理
现在,如果我在这里使用单个Bolt,它会自动将消息丢弃给这三个代理,并让我们说其中一个失败(由于不可用等),我称之为收集器的失败方法。
在螺栓上调用fail方法后,在我的Spout中,fail方法会被调用。
在这里,我相信我将不得不再次处理整个消息(我必须确保必须处理每个消息),即使3个消息中有2个已成功传递。
或者,即使我将这3个子消息发送到不同的螺栓,我认为即使在这种情况下,Spout也必须再次处理整个消息。
这是因为我在第一次在spout nextTuple()方法中发出消息时附加了一个Unique Guid。
有没有办法确保只处理失败的子消息而不是整个消息?
由于
答案 0 :(得分:0)
Storm(低级Java API)仅提供"至少一次"处理保证,即没有支持避免在发生故障时重复处理。
如果您只需要进行一次,则可以在Storm之上使用Trident。但是,如果您向外部系统发送数据,即使Trident也不能给出一次(如果外部系统无法检测和删除重复项)。这不是特定风暴但是一般问题。其他系统,如Apache Flink,Apache Spark Streaming或S-Store(麻省理工学院最近的一个研究原型系统 - > Stonebraker)"遭受"从完全相同的问题。
也许最好的方法是尝试Trident来评估它是否能满足您的要求。