2015-09-23 19 views
0

我正在尝试一种方案,在该方案中,我有一个从Message Broker读取数据并将消息作为元组发送到螺栓进行某些处理的Spout。将元组发送到不同的螺栓

螺栓后处理将其转换为单独的消息,并且每个子消息都必须发送到可托管在不同机器上的不同代理。

假设我有有限的收件人(在我的情况下有3个Message Brokers用于输出)。

所以,Bolt1后处理可以直接删除邮件给这3个消息代理现在

,如果我在这里使用一个单一的博尔特这本身下降的消息,这三家券商和让说,他们中的一个出现故障(由于不可用等),我称之为收集器的失败方法。

一旦在螺栓上调用失败方法,我的Spout失败方法将被调用。

在这里,我相信我将不得不再次处理整个消息(我必须确保每个消息都要被处理),即使3条消息中有2条被成功传递。

另外,即使我将这3个子消息发送到不同的螺栓,我认为即使在这种情况下,Spout将不得不再次处理整个消息。

这是因为我在喷嘴nextTuple()方法中第一次发出消息时追加了唯一Guid。

有没有办法确保只处理失败的子消息而不是整个消息?

由于

回答

0

风暴(低电平的Java API)仅提供“一次刻录至少-”处理的保证,即,没有支持,以避免对故障的情况下重复处理。

如果您只需要一次操作,就可以在Storm上使用Trident。但是,如果您将数据发送到外部系统(如果外部系统无法检测和删除重复项),即使是Trident也不能给出一次。这不是暴风雨的具体问题,而是一般问题。像Apache Flink,Apache Spark Streaming或S-Store(麻省理工学院最近的一个研究原型系统 - Stonebraker)等其他系统也遭受同样的问题。

也许最好的方法是尝试三叉戟评估它是否能够满足您的要求。

相关问题