Storm 中任务 ID、消息 ID 和流 ID 之间的区别? "anchoring tuples" 和 "acker tasks" 与上下文有何关系?

Difference between Task ID vs Message ID vs Stream ID in Storm? And how "anchoring tuples" and "acker tasks" are related to the context?

我想知道它们之间的区别,它们之间的关系,以及"anchoring tuples"和"acker tasks"的作用是什么。如果可能,请提供详细的解释和示例。看了官方文档和一些相关的文章,但是对这个问题的理解不是很清楚

StreamID:默认情况下有一个名为 default 的(逻辑)流。在某些用例中,有必要的不是单个(逻辑)流,而是多个(每个流中有不同的数据)。为此,您可以声明其他流并为它们分配一个 ID(即名称)以区分它们(这是在 declareOutputFields(...) 方法中完成的)。当 "plugging" 您的拓扑在一起时,默认情况下,您总是分配给默认流(作为输入流),但您也可以明确指定要接收的流的名称。

任务 ID。每个 Spout/Bolt 都有一个指定的并行度(即并行度,dop)。因此,每个 Spout/Bolt 都在多个任务中执行,并且每个任务都分配了一个 ID,以便可以区分它们。

MessageID:如果你想使用容错机制,你需要为Spouts发出的每个元组分配一个唯一的ID。

Acker 任务:这些任务用于处理来自您的螺栓的 ack 消息(即,当您调用 collector.ack(...) 时系统发送的消息或 collector.fail(...)) 来跟踪元组是成功处理还是失败。平时不用理会。

锚定:锚定是一种告诉Storm,哪些输入元组用于产生哪些输出元组的机制。例如,如果你有一个 Bolt,它将一个句子分成单词并为每个单词发出一个元组,你会将所有单词锚定到同一个句子。 (如果单词元组中的一个失败,Storm 知道它需要回复句子元组以便恢复丢失的元组)。另一方面,如果您汇总最后 5 个输入元组来计算平均值,您将缓冲所有 5 个输入元组,直到发出平均元组并将所有 5 个输入元组用作此单个 avg 输出元组的锚点。 (同样,如果输出元组丢失,Storm 知道它需要回复所有 5 个输入元组,以便可以重新计算丢失的平均元组)。请注意,您不能将元组用作锚点,它们已经被 Storm 确认。因此,您需要延迟确认输入元组,直到不再需要它作为锚元组。