风暴拓扑:当两个螺栓具有相同的源螺栓时,正确的方法

时间:2017-02-11 20:05:05

标签: apache-storm distributed-computing

我对Storm很新,最近改变了我的螺栓继承IRichBolt 而不是BaseBasicBolt,意味着我现在负责acking和失败 根据我自己的逻辑一个元组。

My topology looks like this: Bolt A向Bolts B和C发出相同的元组,每个都将数据保存到Cassandra。 这些操作不是幂等的,包括对两个不同计数器列族的更新。 我只对失败元组并在Cassandra的某些异常中重放它感兴趣(不是读/写超时,只有QueryConsistency或Validation异常)。 问题在于,如果螺栓B发生故障,则从喷口重放相同的元组并再次发射到螺栓C,螺栓C已成功保留其数据,从而产生错误数据。

我试图理解如何完成acking(来自阅读:http://www.slideshare.net/andreaiacono/storm-44638254)但未能理解 在我上面描述的情况下会发生什么。

我想要正确解决这个问题的唯一方法是使用相同的输入源创建另一个喷口:Spout 1 - >螺栓A - >螺栓B和喷口1' - >螺栓A' - > Bolt C',或者将两个列族的数据保存在Bolts B和C中完成的同一批语句中,将它们合并为一个。

这是正确的还是我错过了什么?是否有另一种可能的解决方案来正确识别这些元组?

感谢。

1 个答案:

答案 0 :(得分:1)

你没有说要等多久才能重试螺栓B或C中的失败更新,但是没有完全失败螺栓B中的元组,你可以添加更多的流。将螺栓B的蝎尾输出流添加回同一螺栓B.如果螺栓B中的更新失败,则将元组写入蝎尾输出流,使其再次作为输入再次输入到螺栓B中,仅从第二流。你可以丰富元组来保存一个时间戳,这样你在新流的螺栓B上的处理逻辑可以查看最后一次尝试的时间,如果还没有足够的时间,你可以再次将它写入蝎尾流。当然,你对螺栓C做同样的事情。

如果你想等待很长时间重试元组(长期用暴风语来说),你可以用Kafka主题和必要的鲸鱼代替那些蝎子尾流。