繁体   English   中英

使用Actors / AKKA的面向会话的异步架构

[英]Session Oriented Asynchronous Architecture using Actors/AKKA

我们正在构建的应用程序有一个非常简单的概念:它接收来自数据库的传入事件,并且对于每个事件,它通过显示菜单打开与客户端(在事件中)的交互式会话 根据客户的反应,我们进入下一个州或采取一些具体行动(例如转移资金)。

会话彼此独立。 例如,假设我们从数据库中获得两个事件,表明客户端A和B已达到零帐户余额状态。 为响应此事件,我们建立了两个与A和B的连接,显示了一个如下所示的菜单:

 Please select an option:
 1. Get $5
 2. Get $10
 3. Ignore

对于选项1和2,我们要求以第二个菜单的形式进行确认。

 Are you sure?
 1. yes
 2. no

在这种情况下,我们将有两个会话。 客户A可以选择选项1( 1. Get $5 ),而客户B选择选项3 [在第一个菜单中]。 在客户A的情况下,我们将提供第二个菜单 (上图),如果响应是1. yes ,我们将采取一些具体行动,如转移资金和关闭会话。

所有客户端通信都由第三方系统完成,该系统采用JSON包括客户端地址,菜单文本并将响应返回给我们。 它负责实际维护线路上的会话,而我们只需要做响应关联并处理会话状态。

我们预计会同时处理50,000个此类会话

之前,我们使用SEDA模型在Java中设计了系统。 听说Actors之后,我们愿意检查它们并编写一个快速的PoC项目(Java / AKKA)。 我的问题是:

  1. 有没有人有建立这种应用程序的经验? 同时进行的50,000次会议对于AKKA来说太过分了吗? (注意,我们只是在等待响应。当响应到来时,根据答案,我们跳到下一个阶段,所以它应该是可能的)。

  2. 哪种建筑风格/范例最适合AKKA中的这个问题? 这类问题有没有框架?

这实际上是Akka集群的一个相当简单的用例。 表示为每个的Actor实例的50K会话的负载不是很高。 使用群集的原因仅限于容错。

该体系结构背后的想法是拥有一个Web层来处理与会话相对应的RESTful请求。 这些请求将被发送到Akka集群,并通过会话ID路由到相应的会话Actor,否则将创建新的请求。 会话完成后,您将停止与其关联的actor。

请注意,会话actor应该通过调度程序发送自己的超时消息。 完成处理新消息后,actor应该通过ActorSystem调度程序为消息安排一个消息15分钟(或者你的超时是什么)。 收到新会话消息时,应取消该计划任务,处理新更新,然后安排新超时。 这里有一个看似合理的竞争条件,因为超时消息可能在会话消息之后的会话参与者的邮箱队列中,但如果您的超时消息包含计划时间(15分钟前),您可以检查并忽略它并重新安排另一个(仅作为避免内存泄漏的安全机制)。 如果时间大于15分钟,则停止演员。

要了解如何实现会话参与者的工作分配,请参阅Typesafe的Activator中的“使用Akka和Java的分布式工作者”模板。 您将拥有一个完全运行的集群Akka应用程序,您可以定制它来执行会话管理,如上所述。 然后,您可以导出项目并在Eclipse / IntelliJ / Sublime / TextMate / etc中处理它。 要下载Activator,请参阅此处

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM