如何自动缩放分片Akka群集?

问题描述

Akka群集文档未指定如何自动扩展群集-添加删除节点。在Akka生态系统中应该如何实现?例如,在两种情况下-当我们使用VM作为节点或组成集群的Kubernetes中的容器时。

如果特定节点上的负载很低,Akka Cluster是否会将Actors从那里移动到其他节点并自动关闭未充分利用的节点?

如果Akka Cluster不具有弹性功能,并且依赖于为此,使用Kubernetes(如here所述),然后再次,如果Kubernetes决定删除未充分利用的Akka集群节点,如何确保剩余在未充分利用的节点中的Actor被“优雅地”移动到其他群集节点?

解决方法

Akka群集无法处理从一个节点移动到另一个节点的参与者。

随着节点离开并加入集群,集群分片将转移托管分片的责任。基本上,如果一条消息通过集群分片发送到一个无主的分片中的actor(例如,因为托管该分片的节点不再在集群中),则将为该分片分配一个节点(默认情况下,如果我没记错的话) ,该策略是在负责最少分片的节点上启动分片,但其他策略,例如在发送初始消息的节点上启动分片(对于从分区的Kafka主题提取等操作很有用)。>

actor在新节点上开始时,默认情况下,它们不会从先前运行的任何节点上保留其状态。 Akka Persistence提供了允许参与者恢复其状态的能力。这就是为什么在使用Akka群集分片时经常使用Akka Persistence的原因。

启动服务实例不是Akka的责任,而是Kubernetes,Mesos或您要使用的任何控制平面的责任。至于缩小规模,如果集群节点不忙,让它们脱机并不难:尽管您需要自己一些才能实现((可能必须与k8s等进行交互,以防止出现异常)退出被解释为需要生成新实例的失败)。

相关问答

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