在这一刻,我只在一个节点上运行了这个参与者会话管理实现:
1)我有一个处理所有会话的SessionManager参与者
2) SessionManagerActor接收两条消息:CreateSesion(id)和ValidateSesion(id)
3)当SessionManagerActor接收到CreateSesion(id)消息时,它使用actorFor方法创建一个SessionActor,如下所示:
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是无状态的,我需要在集群中的任何地方找到它们。)
发布于 2014-12-09 07:51:47
因为您有一个协议,可以验证会话是否已经存在,并且有时间在会话上运行,所以从技术上讲,这不是完全无状态的。例如,您可能不希望丢失现有的会话并再次任意地将它们拆分,而且您可能不希望在每个id中创建多个会话。
因此,我将研究聚类切分机制,可能与akka持久化相结合来持久化会话的过期状态。
这将为您提供一个容错设置,并在节点下降或新节点出现时进行再平衡。
例如,激活模板akka簇切分scala可能有助于编写代码。
https://stackoverflow.com/questions/27371688
复制相似问题