有没有办法在akka集群分片中实现服务降级?

Is there a way to achieve service downgrade in akka cluster sharding?

我正在尝试构建一个 Akka 集群ShardRegion,当出现错误时可能需要在生产环境中降级。但是,不是通过调用

来注销它
ClusterClientReceptionist.get(nodeActorSystem).unregisterService(shardRegion)

这将在 PoisonPill 之前消耗完所有消息后终止 ShardRegion 及其子 actor,我的分片子 actor 具有需要完成的内部状态和目的。我需要一种优雅的方式来使用 ShardRegion 慢慢降级进程,让中间的任何会话完成,例如任何具有不同 EntityId 的新消息都将发送到其他地方。

我还没有找到任何方法来降级它,或者只是简单地停止任何新的分片 AkkaActor 来支持 ShardRegion.Is 这甚至可以在 Akka Cluster ShardRegion 中实现?

您可以通过指定自定义 stopMessage 来完成其中的一部分。当要钝化或重新平衡实体参与者时,分片区域会将此命令发送给实体参与者。默认值为 PoisonPill,但自定义的允许实体参与者做任何他们需要做的事情来关闭(在这种情况下他们确实需要最终停止自己)。

如果您触发重新平衡,发送到分片的消息将被缓冲,直到该分片中的所有活动实体都停止为止,这可能符合“任何具有不同实体 ID 的新消息将被发送到其他地方” .请注意,在集群分片之外(即直接在实体参与者之间)发送的消息仍将正常传递(直到所述实体参与者停止)。