Akka源码分析-Remote-网络链接生命周期

  remote模式下,网络链接的生命周期往往影响着对应Actor的生命周期,那么网络链接的生命周期是怎么样的呢?

   每一个与远程系统的链路都是四个状态之一:空闲、活跃、被守护、被隔离。远程系统的某个地址没有任何通信之前其关联状态就是Idle(空闲)。当第一条消息试图发送给远程系统或入站链接被接受,链路的状态就被转化为Active(活跃),这也意味着两个系统有消息的接收或者发送,而且目前为止也没有发生任何失败。当一个通信失败,或者两个系统间的链接丢失,链路的状态就会变成Gated(被守护)。在被守护状态,系统不会试图去链接远程系统主机,所有出站消息都会被丢弃。链路处于Gated状态的时间是通过 akka.remote.retry-gate-closed-for 参数控制的,当超过这个时间,链路状态会重新转化成Idle(空闲)。Gate 是单边的,这也就意味着这期间无论何时当远程系统的入站链接被接受,都会被自动转化成Active(活跃)状态,通信被立即重用。当通信失败,且无法恢复时,由于参与系统的状态不一致,远程系统就会变成Quarantined(被隔离)状态。与Gate不同,被隔离是永久的,它会一直持续到其中一个系统被重启。重启之后,通信可以被重新恢复,链路状态重新变成Active(活跃)。

  其实remote的链路状态也比较容易理解,当没有建立连接时,就处于空闲状态;有入站链接请求或消息发送时,如果连接建立成功,则变成活跃状态;活跃状态时,如果发生通信失败且不是致命错误,比如网络中断,就会转到被守护状态;被守护状态下,在指定时间内,如果网络正常,且收到了成功的入站链接请求,则重新恢复到活跃状态,若超过指定守护时间则转化到空闲状态;在活跃状态下,如果发生灾难性、不可恢复的错误,比如系统消息传递失败或收到MemberRemoved事件,则该链路被隔离,直到远程系统重启后,收到成功的入站或出站链接,则重新转换到活跃状态。

  被守护、被隔离都是应对网络故障的,但分别对应可恢复和不可恢复。被守护期间还有一定的时间阈值,该阈值内还有机会编程活跃状态。

lifecycle-and-failure-recovery-model:https://doc.akka.io/docs/akka/current/remoting.html#lifecycle-and-failure-recovery-model

原文地址:https://www.cnblogs.com/gabry/p/9394507.html