为什么 Storm 使用 XOR 来确保拓扑中的每个 Bolt 都成功执行而不是计数器

问题描述

我是风暴的初学者。 Storm 的创建者创建了一个非常令人印象深刻的方法来检查拓扑中的每个 Bolt,它使用 XOR。 但我开始想知道他为什么不使用计数器。当一个 Bolts 成功执行时,计数器将减一。所以当计数器等于0时,表示整个任务完成。

谢谢

解决方法

我相信可以解释为什么计数器不仅效率低下,而且在始终运行的拓扑中是一种错误的acker 跟踪器机制。

  • Storm 元组拓扑本身可以是一个复杂的 DAG。当一个 bolt 从多个下游源收到 ack 时,它与计数器有什么关系?它应该增加它们,它应该总是减少它们吗?按什么顺序?

  • Storm 元组具有随机消息 ID。计数器将是有限的。拓扑永远运行,发出数十亿个元组。您将如何将第 673686557 个元组映射到计数器 ID?使用 XOR,您只需维护和广播一个状态。

  • XOR 运算是执行效率极高的硬件指令。计数器是需要大量存储的多头。它们存在溢出问题,并以低空间开销解决方案的原始要求失败。