【问题标题】:Storm topology transaction and Database transaction风暴拓扑事务和数据库事务
【发布时间】: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


【解决方案1】:

要了解storm如何处理事务,请查看他们的Transactional topology documentation。它写得很好,应该给你一个很好的概念。

现在,您可以选择trident,而不是使用普通风暴管理事务,它是建立在风暴之上的顶级抽象,并允许更好地处理事务功能。文档很好,并详细描述了方法。

另请查看here,了解storm 如何保证消息得到充分处理。

【讨论】:

    猜你喜欢
    • 2013-08-06
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多