此时我只在一个节点中运行此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-remote
,akka-cluster
,akka-cluster-sharding
,akka-cluster-singleton
,akka-distributed-publish-subscribe-cluster
,但我不确定哪一个是最合适也是最简单的方法。 (请注意,SessionActors是无状态的,我需要在集群中的任何位置找到它们。)
答案 0 :(得分:1)
由于您有一个协议,您可以在其中验证会话是否已存在并且在会话中具有生存时间,因此从技术上讲,这不是完全无状态的。例如,您可能不想丢失现有会话并随意重新启动它们,并且您可能不希望每个ID创建多个会话。
因此,我会查看cluster sharding机制,可能与akka-persistence结合使用,以保持会话的到期状态。
当节点关闭或新节点出现时,这将为您提供容错设置和重新平衡。
激活器模板akka cluster sharding scala可能对示例代码有帮助。