我有一个喷嘴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只提供一次保证。
或者,作为最后的手段,使用一个不同的系统,它提供了开箱即用的一次性语义。