如何处理由 Storm 重放引起的事件重复,以防其中一个螺栓出现 fail()



我有一个喷嘴S的拓扑,和3个螺栓- a, B, c

Bolt A从Spout s读取数据,然后将数据分成螺栓B和螺栓C(基于某些过滤器)。螺栓B和C有各自的数据集。

如果我使用Storm的锚定并将元组锚定在螺栓A,然后在螺栓B上成功,但螺栓C失败()。Storm在S喷口重放会不会导致B喷口事件的重复,从而导致B喷口数据的重复?

如果是这样,在使用风暴锚定的可靠性特性的情况下,如何避免这种情况?

Storm的锚定功能只支持至少一次处理,并且不支持在失败的情况下处理重复。根据您的应用程序语义,这可能是一个问题,也可能不是。

例如,如果您稍后执行幂等操作,则不会出现重复的问题(幂等操作的一个示例是更新键值存储—如果您因为重复而执行两个put操作,则键值存储的状态仍然相同)。

如果你有非幂等操作,并且重复是一个问题,你可以尝试自己处理——但是这很难正确处理。

作为一种选择,你可以使用Trident API代替低级API,低级API只提供一次保证。

或者,作为最后的手段,使用一个不同的系统,它提供了开箱即用的一次性语义。

最新更新