如果遇到来自其中一个螺栓的失败(),如何处理由Storm重放引起的重复事件

时间:2016-10-28 04:00:12

标签: apache-storm

我有一个带喷口S的拓扑,还有3个螺栓 - A,B,C。

螺栓A读取Spout S. Bolt A然后将数据拆分为螺栓B和C(基于某些过滤器)。螺栓B和C有各自的数据接收器。

如果我使用Storm的锚定并将元组锚定在Bolt A,然后在Bolt B ack上成功,但Bolt C会失败()。在Spout S上由Storm重播是否会导致Bolt B事件重复进入B的数据接收器?

如果是这样,在使用风暴的可靠性锚定功能的同时避免这种情况的方法是什么?

1 个答案:

答案 0 :(得分:0)

Storm的锚定功能仅支持至少一次处理,并且在发生故障时不支持处理重复项。根据您的应用程序语义,这可能是一个问题。

例如,如果稍后进行幂等操作,则复制不是问题(幂等操作的示例是更新键值存储 - 如果由于重复而进行两次put操作,则状态键值存储仍然是相同的。)

如果你有非幂等操作并且重复是一个问题,你可以尝试照顾你自己 - 但这很难做到。

作为替代方案,您可以使用Trident API而不是提供一次性保证的低级API。

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