ApacheStorm—以编程方式暂停和重新启动拓扑中的喷口

but5z9lq  于 2021-06-24  发布在  Storm
关注(0)|答案(1)|浏览(276)

在这种情况下,我需要通过编程停止喷口,并在外部事件发生变化时使用更新的参数重新启动喷口。可以将此视为一个外部系统,它为我提供了对消息源的过期密钥访问。
所以一旦到期,我需要更新这个代币,重新启动喷口。我一直在尝试风暴信号(https://github.com/ptgoetz/storm-signals/)为了达到这个目的。虽然我可以把信息输入喷口,但重新启动喷口似乎不起作用。其他的选择是作为一个整体重新启动拓扑(nimbusapi?),我不想这样做。有什么建议吗

bpsygsoo

bpsygsoo1#

我要试着回答这个问题,因为我对你的情况还不太清楚。
解决方案1:喷口更新令牌
如果您的喷口有一个过期令牌,它用来连接到您的数据源(例如jwt),并且需要定期续订,理想的解决方案是在令牌上添加一个过期时间戳,这样喷口就可以在旧令牌接近过期时请求一个新的令牌,或者当数据源返回未经授权的错误时,让喷口请求一个新的喷口请求。检查时间戳应该只是一个最小的开销,所以您应该能够在每个nexttuple调用上进行检查。
解决方案2:外部进程使用storm信号和nimbus api
如果喷口由于某种原因无法续订令牌本身,或者您不想在nexttuple中进行续订,则可以考虑使用https://github.com/ptgoetz/storm-signals/ (如链接所示)以及nimbusapi,并让外部进程更新凭据。
如果你把喷口重新连接到 activate 方法而不是 open 方法,您可以使用风暴信号将凭证发送到喷口。一旦喷口收到凭证(您可以使用https://github.com/ptgoetz/storm-signals/blob/master/src/main/java/org/apache/storm/contrib/signals/standalonesignalconnection.java 要在喷口更新凭证时从喷口接收回信号,可以使用nimbusapi循环激活拓扑。Storm要来了 deactivate 然后 activate 在喷口上,应该可以让你重新连接。
解决方案3:外部进程只使用风暴信号
当喷口接收到带有更新凭证的信号时,没有什么可以阻止您让它循环连接,而不必接触nimbusapi。就吃这个吧 onSignal 方法在接收到新凭据时在spout中设置一个标志(我相信onsignal在与其他spout方法不同的线程中运行,因此请记住您应该为此使用atomicboolean/reference),然后签入 nextTuple . 什么时候 nextTuple 如果该标志为true,则将其设置为false并循环连接/重新初始化喷口。
如果可能的话,我倾向于解决方案1。让外部进程更新凭证增加了复杂性,这意味着您必须处理令牌更新太少或外部进程关闭等问题,以及如何处理喷口和外部进程之间的信令。

相关问题