【问题标题】:Emitting Tuple to different Bolts将元组发送到不同的螺栓
【发布时间】:2015-10-20 00:31:22
【问题描述】:

我正在尝试一个场景,其中我有一个 Spout,它从 Message Broker 读取数据并将消息作为元组发送到 Bolt 以进行某些处理。

Bolt 后处理将其转换为单独的消息,每个子消息必须发送到不同的代理,这些代理可以托管在不同的机器上。

假设我有有限的收件人(在我的例子中,有 3 个消息代理用于输出)。

所以,Bolt1 后处理可以将消息直接投递到这 3 个消息代理中

现在,如果我在这里使用单个 Bolt 将消息单独发送到这三个代理,并假设其中一个失败(由于不可用等),我将其称为收集器的失败方法。

一旦在 bolt 上调用了 fail 方法,在我的 Spout 中 fail 方法就会被调用。

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

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

这是因为我在 spout nextTuple() 方法中第一次发出消息时附加了一个独特的 Guid。

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

谢谢

【问题讨论】:

    标签: apache-storm


    【解决方案1】:

    Storm(低级 Java API)仅提供“至少一次”处理保证,即不支持在发生故障时避免重复处理。

    如果您只需要一次继续,您可以在 Storm 之上使用 Trident。但是,如果您将数据发送到外部系统(如果外部系统无法检测和删除重复项),即使 Trident 也无法准确给出一次。这不是 Storm 特定的问题,而是普遍的问题。其他系统,如 Apache Flink、Apache Spark Streaming 或 S-Store(麻省理工学院最近的研究原型系统 -> Stonebraker)“遭受”完全相同的问题。

    也许最好的方法是试用 Trident 来评估它是否能满足您的要求。

    【讨论】:

      猜你喜欢
      • 2019-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 1970-01-01
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多