我有一个Storm拓扑,我必须将输出发送到kafka并更新redis中的值。为此,我有一个Kafkabolt和一个RedisBolt。 以下是我的拓扑结构-
tp.setSpout("kafkaSpout", kafkaSpout, 3);
tp.setBolt("EvaluatorBolt", evaluatorBolt, 6).shuffleGrouping("kafkaStream");
tp.setBolt("ResultToRedisBolt",ResultsToRedisBolt,3).shuffleGrouping("EvaluatorBolt","ResultStream");
tp.setBolt("ResultToKafkaBolt", ResultsToKafkaBolt, 3).shuffleGrouping("EvaluatorBolt","ResultStream");
问题在于,两个末端螺栓(Redis和Kafka)都在侦听来自先前螺栓(ResultStream)的相同流,因此两者都可能独立失败。我真正需要的是,如果结果成功在Kafka中发布,那么只有我在Redis中更新值。有没有办法让kafkaBolt产生输出流,让我可以将消息成功发布到Kafka?然后,我可能可以在RedisBolt中收听该流并采取相应的措施。
答案 0 :(得分:1)
当前无法实现,除非您修改了螺栓代码。您最好稍微改变一下设计,因为将元组写入Kafka之后进行额外的处理会有一些缺点。如果您将元组写入Kafka而未写入Redis,则将在Kafka中获得重复项,因为处理将从喷嘴开始。
根据您的用例,最好将结果写入Kafka,然后让另一个拓扑从Kafka读取结果并写入Redis。
如果仍然需要能够从螺栓中发出新的元组,则应该很容易实现。该Bolt最近具有添加自定义Producer回调的功能,因此我们可以扩展该机制。
有关上下文,请参见https://github.com/apache/storm/pull/2790#issuecomment-411709331上的讨论。