代码之家  ›  专栏  ›  技术社区  ›  Ramachandran.A.G

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

  •  1
  • Ramachandran.A.G  · 技术社区  · 6 年前

    在这种情况下,我需要通过编程停止喷口,并在外部事件发生变化时使用更新的参数重新启动喷口。可以将此视为一个外部系统,它为我提供了对消息源的过期密钥访问。

    所以一旦到期,我需要更新这个代币,重新启动喷口。我一直在尝试风暴信号( https://github.com/ptgoetz/storm-signals/ 有什么建议吗

    1 回复  |  直到 6 年前
        1
  •  1
  •   Stig Rohde Døssing    6 年前

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

    如果您的喷口有一个过期令牌,它用来连接到您的数据源(例如JWT),并且需要定期续订,理想的解决方案是在令牌上添加一个过期时间戳,这样喷口就可以在旧令牌接近过期时请求一个新的令牌,或者当数据源返回未经授权的错误时,让喷口请求一个新的喷口请求。检查时间戳应该只是一个最小的开销,所以您应该能够在每个nextTuple调用上进行检查。

    如果喷口由于某种原因无法续订令牌本身,或者您不想在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循环激活拓扑。暴风雨要来了 deactivate 激活 在喷口上,应该可以让你重新连接。

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

    当喷口接收到带有更新凭证的信号时,没有什么可以阻止您让它循环连接,而不必接触nimbusapi。就吃这个吧 onSignal 方法在接收到新凭据时在spout中设置一个标志(我相信onSignal在与其他spout方法不同的线程中运行,因此请记住您应该为此使用AtomicBoolean/Reference),然后签入 nextTuple . 什么时候? 下一个

    如果可能的话,我倾向于解决方案1。让外部进程更新凭证增加了复杂性,这意味着您必须处理令牌更新太少或外部进程关闭等问题,以及如何处理喷口和外部进程之间的信令。