【发布时间】:2013-11-03 17:16:15
【问题描述】:
我正在使用风暴,A 拓扑有一个螺栓“A”,它在数据库中插入记录并发射到另一个螺栓“B”。如果元组bolt“B”执行失败,当bolt“A”执行时如何回滚对数据库影响的元组?任何人都可以帮助我吗?谢了
【问题讨论】:
-
您需要使用Trident,它是 Storm 之上的一个抽象,以保证一次性处理。
-
这能保证元组只在数据库中插入一次吗?也就是说,你能确定每个螺栓只执行每个元组一次吗?还是“恰好一次”只是意味着一旦一个元组被所有螺栓确认后,它就永远不会被重放?
-
@JimGarrison 是的,如果 B 失败,元组将从 spout 中重试,并且 Trident 保证元组不能在 A 中再次插入记录?但是在重试完成之前,数据库可能有脏数据?
-
如果您需要跨多个螺栓确保数据库一致性(即事务),我认为 Storm 可能不够用。我不是 Storm 专家,但我读过的所有内容都表明更新数据库的 bolts 必须是事务自包含的。
-
@JimGarrison 您可以通过在数据库之上构建自己的事务层来解决这些问题。我已经这样做了很多次,以确保拓扑中多个螺栓的数据库一致性。
标签: java real-time apache-storm