删除后,Akka群集节点重新加入

问题描述

我试图了解akka群集成员身份的工作方式以及在以下情况下如何使用它。

我有N个节点,我希望使用分片和单例。但是这些节点是从外部控制的,我想(自动或手动,没关系)按比例缩放它们。添加新节点并关闭现有节点(以及以后删除节点)很容易。

但是可以从集群中临时删除一个节点并将其返回吗?当我尝试这样做时,下降机制只是简单地终止actor系统和JVM。我希望能够保持actor系统正常运行,但是使该节点处于“被动”状态,不接受服务于单例或碎片(或其他任何东西),而是等待手动添加(必要时重新启动)。例如,侦听某种消息队列,并在要求时重新加入。

解决方法

actor系统在退出集群后(或被集群中足够多的其他节点声明要删除的集群)无法重新加入集群。

The docs are clear on this

已退出或已关闭的节点上的actor系统无法再次加入集群。特别是,一个在无法访问时被关闭然后重新获得连接的节点无法重新加入群集。相反,必须在节点上重新启动该过程,创建一个新的actor系统,该系统可以再次经历加入过程。

这可能是可能的(阅读:我不知道有什么方法可以阻止这种情况),尤其是在节点启动自己从集群中删除的情况下(可能是响应通过非集群发送的命令)侧通道(例如本地HTTP端点或通过消息队列),以便节点离开群集并像以前一样继续运行其本地参与者系统。当被告知“重新加入”时,该节点将终止参与者系统(而不是JVM),然后启动新的参与者系统,新的参与者系统将加入集群。

那是说,我做这种事情(相对于离开集群更多然后停止actor系统和JVM,然后重新启动JVM)唯一能看到的一般好处就是消除了冷启动和JIT。 JVM的预热时间,我真的想知道额外的复杂性是否值得。毕竟,通过过度配置和主动进行自动缩放,可以很容易地缓解放大时的冷启动和预热延迟。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...