Akka集群应用程序上的CoordinatedShutdown超时

时间:2017-10-18 15:31:34

标签: scala akka akka-cluster

我们有一个akka集群应用程序(对一些演员进行分片)。有时,当我们部署并且应该关闭我们的应用程序时,我们会看到一些类似的日志:

  

协调关闭阶段[cluster-sharding-shutdown-region]定时   10000毫秒后退出

自上次部署后超过2天(例如星期一),首次部署时会发生这种情况。我们要求akka节点使用JMX帮助程序退出集群,我们也有以下代码:

actorSystem.registerOnTermination {
  logger.error("Gracefully shutdown of node")
  System.exit(0)
}

因此,当发生此错误时,最终节点将离开集群(或者至少关闭JMX入口点以管理akka集群)但是进程不会完成并且日志"正常关闭节点&#34 ;没有出现。因此,当发生这种情况时,我们需要手动关闭java进程(我们使用supervisor处理它)并重新部署。

我知道可以通过配置调整超时,但增加此超时的含义是什么?为什么有时协调关闭会引发超时?协调关机超时会发生什么?

任何线索都会受到赞赏:D

谢谢

2 个答案:

答案 0 :(得分:1)

超时后会发生什么?引自Akka documentation

  

如果在配置的超时内未完成任务(请参阅reference.conf),则无论如何都将启动下一阶段。如果任务失败或在超时内未完成,则可以为某个阶段配置recover=off以中止其余的关闭过程。

为什么停机会超时?很可能你在某个地方陷入僵局。在这种情况下,增加超时将无济于事。您可能还需要更多时间进行关机。然后,您必须增加超时。

但与您的问题更相关的可能是以下内容:

  

默认情况下,JVM没有被强制停止(如果所有非守护程序线程都已终止,它将被停止)。要启用硬System.exit作为最终操作,您可以配置:

akka.coordinated-shutdown.exit-jvm = on

所以你可以打开它,这应该解决“手动关闭java进程”步骤。

尽管如此,最难的问题是找出为什么关机会在一开始就超时。我想通过上述技巧你可以存活一段时间,但你最好花一些时间来找到真正的原因。

答案 1 :(得分:0)

我们曾经面临这个问题(协调关闭阶段超时之一)用于短期应用。

我们遇到这种情况的用例:

  1. 应用程序加入现有的akka​​群集
  2. 有些工作吗
  3. 离开群集
  4. 但是在步骤3中,成员的状态仍然是(Joining或WeaklyUp),如果您看到为PhaseClusterLeave添加了任务,则只有在其状态为UP时才允许从群集中删除成员。

    ClusterDaemon.scala中的Snippet,它在Running ClusterLeave阶段调用:

    def leaving(address: Address): Unit = {
      // only try to update if the node is available (in the member ring)
      if (latestGossip.members.exists(m ⇒ m.address == address && m.status == Up)) {
        val newMembers = latestGossip.members map { m ⇒ if (m.address == address) m.copy(status = Leaving) else m } // mark node as LEAVING
        val newGossip = latestGossip copy (members = newMembers)
    
        updateLatestGossip(newGossip)
    
        logInfo("Marked address [{}] as [{}]", address, Leaving)
        publishMembershipState()
        // immediate gossip to speed up the leaving process
        gossip()
      }
    }
    

    为了解决这个问题,我们最终编写了自己的CoordinatedShutdown,您可以在此处参考CswCoordinatedShutdown.scala