多个节点中的Akka会话actor

时间:2014-12-09 04:56:00

标签: akka session-management akka-cluster

此时我只在一个节点中运行此actor会话管理实现:

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

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

3)当SessionManagerActor收到CreateSesion(id)消息时,它会使用SessionActor方法创建actorFor,如下所示:

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

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

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


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

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

我已阅读akka文档,它提供akka-remoteakka-clusterakka-cluster-shardingakka-cluster-singletonakka-distributed-publish-subscribe-cluster,但我不确定哪一个是最合适也是最简单的方法。 (请注意,SessionActors是无状态的,我需要在集群中的任何位置找到它们。)

1 个答案:

答案 0 :(得分:1)

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

因此,我会查看cluster sharding机制,可能与akka-persistence结合使用,以保持会话的到期状态。

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

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