如果其中一个螺栓出现 fail(),如何处理由 Storm 重放引起的事件重复
How to handle duplication of events caused by Storm's replay in case of fail() from one of the bolts
我有一个带 Spout S 和 3 个螺栓 - A、B、C 的拓扑。
Bolt A 从 Spout S 读取数据。Bolt A 然后将数据拆分为 Bolt B 和 Bolts C(基于某些过滤器)。螺栓 B 和螺栓 C 有各自的数据接收器。
如果我使用 Storm 的锚定并将元组锚定在 Bolt A,然后在 Bolt B ack 上成功,但 Bolt C 执行 fail()。 Storm 在 Spout S 上重播是否会导致 Bolt B 上的事件重复并因此进入 B 上的数据接收器?
如果是这样,在仍然使用 storm 的锚定可靠性功能的同时避免这种情况的方法是什么?
Storm的锚定特性只支持at-least-once处理,不支持在失败的情况下处理重复。根据您的应用程序语义,这可能是一个问题。
例如,如果您稍后进行幂等操作,则重复不是问题(幂等操作的一个示例是更新键值存储——如果您因为重复而进行两次 put
操作,键值存储的状态仍然相同。
如果您有非幂等操作并且重复是一个问题,您可以尝试自行处理 - 但这很难做到正确。
作为替代方案,您可以使用 Trident API 而不是低级别的 API,它确实提供了 exactly-once 保证。
或者,作为最后的手段,使用不同的系统,它确实提供开箱即用的恰好一次语义。
我有一个带 Spout S 和 3 个螺栓 - A、B、C 的拓扑。
Bolt A 从 Spout S 读取数据。Bolt A 然后将数据拆分为 Bolt B 和 Bolts C(基于某些过滤器)。螺栓 B 和螺栓 C 有各自的数据接收器。
如果我使用 Storm 的锚定并将元组锚定在 Bolt A,然后在 Bolt B ack 上成功,但 Bolt C 执行 fail()。 Storm 在 Spout S 上重播是否会导致 Bolt B 上的事件重复并因此进入 B 上的数据接收器?
如果是这样,在仍然使用 storm 的锚定可靠性功能的同时避免这种情况的方法是什么?
Storm的锚定特性只支持at-least-once处理,不支持在失败的情况下处理重复。根据您的应用程序语义,这可能是一个问题。
例如,如果您稍后进行幂等操作,则重复不是问题(幂等操作的一个示例是更新键值存储——如果您因为重复而进行两次 put
操作,键值存储的状态仍然相同。
如果您有非幂等操作并且重复是一个问题,您可以尝试自行处理 - 但这很难做到正确。
作为替代方案,您可以使用 Trident API 而不是低级别的 API,它确实提供了 exactly-once 保证。
或者,作为最后的手段,使用不同的系统,它确实提供开箱即用的恰好一次语义。