0

在这一刻,我有这个演员会话管理实现只在一个节点上运行:

1)我有一个SessionManager处理所有会话的演员

2)SessionManagerActor接收两条消息:CreateSesion(id)ValidateSesion(id)

3)当SessionManagerActor接收到CreateSesion(id)消息时,它会创建一个SessionActorusingactorFor方法,如下所示:

context.actorOf(Props(new SesionActor(expirationTime)), id)

4)当SessionManagerActor接收到ValidateSesion(id)消息时,它会查找现有消息SessionActor并使用如下方法评估是否存在resolveOne

context.actorSelection("akka://system/user/sessionManager/" + id).resolveOne()


使用该逻辑效果很好,但我需要在多个节点(集群)中实现相同的行为

我的问题是,建议使用哪种方法来实现该会话管理行为,以便它在一个或多个节点中工作?

我已经阅读了 akka 文档,它提供了akka-remote, akka-cluster, akka-cluster-sharding, akka-cluster-singletonakka-distributed-publish-subscribe-cluster但我不确定哪一个是合适且最简单的方法。(请注意,SessionActor 是无状态的,我需要将它们定位在集群中的任何位置。)

4

1 回答 1

1

由于您有一个协议,您可以在其中验证会话是否已经存在并且在会话上具有生存时间,因此从技术上讲,这并不是完全无状态的。例如,您可能不希望丢失现有会话并任意重新启动它们,并且您可能不希望为每个 id 创建多个会话。

因此,我会研究集群分片机制,可能结合 akka-persistence 来保持会话的过期状态。

当节点关闭或新节点出现时,这将为您提供具有重新平衡的容错设置。

激活器模板akka cluster sharding scala可能对示例代码有帮助。

于 2014-12-09T07:51:47.420 回答