我试图弄清楚如何在故障转移期间恢复风暴螺栓状态。我可以在外部(DB或文件系统)保持状态,但是一旦重新启动bolt实例,我需要指向该bolt实例的特定状态来恢复它。 螺栓的准备方法接收上下文,记录在此http://nathanmarz.github.io/storm/doc/backtype/storm/task/TopologyContext.html
我不清楚的是 - 是否有任何一个这样的上下文唯一标识特定的bolt实例,以便我可以理解指向哪个持久状态?故障转移期间是否保留了该ID?或者,是否可以为故障转移期间保留的特定bolt / instance设置任何变量/对象?任何帮助表示赞赏!
BR SIB
P.S。 stackoverflow的新功能所以请耐心等待......
答案 0 :(得分:0)
你可以寻找Trident它基本上是一个建立在风暴之上的抽象。文档说
Trident拥有一流的抽象,可以阅读和写入有状态的资源。状态可以是拓扑的内部 - 例如,保存在内存中并由HDFS支持 - 或者外部存储在数据库中,如Memcached或Cassandra
如果发生任何故障转移,请说
Trident以容错的方式管理状态,以便状态更新在重试和失败时是幂等的。
您可以查看文档以获得进一步的说明。
答案 1 :(得分:0)
Tx(和信用卡)给Storm用户组!
答案 2 :(得分:0)
在原始风暴中,spout
和bolt
都是无国籍的。 Storm可以设法重启节点,但需要一些努力来恢复节点的状态。我能想到两种解决方案:
replay
的逻辑必须由用户实现。因此,在这种情况下,我想在消息中添加更多状态信息(例如,某些外部状态存储的ID和此任务的ID)。 Trident
。它可以为每个事务提供txid
并简化存储过程。 我可以使用第一个解决方案,因为我的应用程序不需要事务操作,而且我对原始Storm有了更好的理解(Storm会生成比Trident更简单的日志)。
答案 3 :(得分:0)
您可以使用task ID。
任务ID在拓扑创建时分配,并且是静态的。如果任务死亡/重新启动或在其他地方重新分配,它仍将具有相同的ID。