Apache storm 制造雨水口,等待螺栓准备就绪

Apache storm 制造雨水口,等待螺栓准备就绪,apache-storm,Apache Storm,现在,雨水口有一个打开的方法来配置它们,螺栓有一个准备方法。有没有办法让所有的喷口实例等待螺栓上的所有准备方法完成监听 我有一个例子,我想把一些配置信息传递给运行中的螺栓(因为配置信息一直在变化)。我在一些地方读到过,我们应该使用Zookeeper或像redis这样的内存键值存储来实现这一点。但我担心的是,如果螺栓还没有准备好处理来自喷口的数据,喷口开始发出元组,会发生什么?有没有办法让喷嘴等待螺栓的更新,说它们准备好了?是的,您可以使用Redis存储配置,然后从prepare方法读取配置 工作

现在,雨水口有一个打开的方法来配置它们,螺栓有一个准备方法。有没有办法让所有的喷口实例等待螺栓上的所有准备方法完成监听


我有一个例子,我想把一些配置信息传递给运行中的螺栓(因为配置信息一直在变化)。我在一些地方读到过,我们应该使用Zookeeper或像redis这样的内存键值存储来实现这一点。但我担心的是,如果螺栓还没有准备好处理来自喷口的数据,喷口开始发出元组,会发生什么?有没有办法让喷嘴等待螺栓的更新,说它们准备好了?

是的,您可以使用Redis存储配置,然后从
prepare
方法读取配置

工作进程调用
prepare
方法,工作进程在完成后开始处理元组。实际上,我认为在工作进程的所有组件就绪之前,不会发出元组


最后,您可以有一个额外的喷口来查找配置更改。然后,如果有新的配置可用,它将通过命名流发送给您的螺栓。

我发现了一个稍微更优雅的解决方案(我认为)。问题是某些螺栓需要配置信息才能处理传入的元组。我发现了Storm重播元组的能力,所以现在我的螺栓从一个喷嘴监听更新,从另一个喷嘴监听元组。只要我没有收到更新,我就会一直让元组失败,并让喷口在一段可配置的时间后重播它们。

你不必担心这一点。风暴框架在喷口前加载螺栓。风暴以相反的顺序加载螺栓。在拓扑中间的螺栓之前,向拓扑末端加载螺栓,最后,喷口被加载。

嗨FHUZ,谢谢您的响应!我决定暂缓解决这个问题,继续做其他事情。不幸的是,Storm并没有等到所有组件都准备好后再启动喷口,所以我想redis是解决此类问题的最佳方法。您好Vivek,您的意思是可以使用所谓的
ConfigSpoot
来代替prepare方法中从redis读取的配置吗?我刚刚发现,如果第二个Bolt在prepare方法中没有完成它的工作,那么第一个喷口或第一个Bolt发出的任何信号都会导致
java.lang.NullPointerException
.Hmm,这很奇怪<如果
prepare
尚未完成,则不应在螺栓上调用code>execute。stacktrace是否指向bolt的
execute
方法中的代码?谢谢Vivek。实际上,prepare方法没有任何内容。我只是发现我忘了为第一个螺栓声明字段,这真是一个愚蠢的错误,嗨,Akhil,我无法验证加载组件的顺序是否正确,但不管下游螺栓是否执行了
prepare()
method或not。一个选项是仅第一次(不是针对每个元组)在spout、Utils.sleep(ms)的nextTuple()方法中使用storm的Utils类。