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

时间:2018-07-11 15:09:22

标签: apache-storm

在这种情况下,我需要以编程方式停止喷口,并在外部事件发生变化时使用更新的参数重新启动喷口。可以将其视为一个外部系统,使我可以对消息源进行有效的密钥访问。

因此,一旦我到期,我需要更新此令牌并重新启动喷嘴。我一直在尝试使用风暴信号(https://github.com/ptgoetz/storm-signals/)来完成此任务。尽管我可以将消息发送到spout中,但是重新启动spout似乎不起作用。其他选项是从整体上重新启动拓扑(Nimbus API?),我不想这样做。 任何指针表示赞赏

1 个答案:

答案 0 :(得分:1)

我将为解决这个问题提供一些帮助,因为您的情况对我来说还不清楚。

解决方案1:喷口更新令牌

如果您的喷口具有用于连接到数据源(例如JWT)的过期令牌,并且需要定期更新,则理想的解决方案是在令牌上放置过期时间戳记,因此当旧令牌即将到期时,spout可以请求一个新的,或者当数据源返回未授权的错误时,让spout请求一个新的。检查时间戳仅是最小的开销,因此您应该能够在每个nextTuple调用中进行此操作。

解决方案2:外部流程使用风暴信号和Nimbus API

如果由于某些原因喷口本身无法更新令牌,或者您不想在nextTuple中进行更新,则可以考虑将https://github.com/ptgoetz/storm-signals/(链接时)与Nimbus API一起使用,并有外部流程更新凭据。

如果使用activate方法而不是open方法重新建立喷口,则可以使用风暴信号将凭据发送到喷口。喷口接收到凭据后(您可以使用https://github.com/ptgoetz/storm-signals/blob/master/src/main/java/org/apache/storm/contrib/signals/StandaloneSignalConnection.java从喷口更新凭据后接收来自喷口的信号),您可以使用Nimbus API循环激活拓扑。 Storm将在喷口上呼叫deactivate,然后呼叫activate,这将使您重新连接。

解决方案3:外部进程仅使用风暴信号

当接收到具有更新的凭证的信号时,没有任何必要阻止Spout循环连接,而无需触摸Nimbus API。只需在收到新凭据时在onSignal方法中在spout中设置一个标志即可(我相信onSignal与其他spout方法在单独的线程中运行,因此请记住,您应该为此使用AtomicBoolean / Reference) ,您在nextTuple中签入。当nextTuple看到该标志为true时,请将其设置为false并循环连接/重新初始化喷嘴。

如果可以的话,我的选择是解决方案1。使用外部流程更新凭据会增加复杂性,这意味着您必须处理例如令牌更新太少,或者外部进程关闭,以及如何处理喷口和外部进程之间的信号。