Akka与现有java项目的集成示例

如果我已经有使用springservlet容器的现有java Web应用程序。 将Akka整合到其中的正确方法是什么?

就像我将要让Actor1Actor2相互通信一样。 什么是开始使用这些演员的切入点? (比如:1。把它放在那里2.更改配置3.获取对actor的引用)

我找到了http://doc.akka.io/docs/akka/2.2-M3/general/configuration.html但是他没有给我提供胶水。 只想获得整合的真实例子。

有一些简单的集成示例吗?

编辑:应用程序执行一些搜索,从外部获取一些数据,将信息存储到文件。

应用程序非常大。 有些组件/对象可以离开自己的生命,即直接客户端请求,它可以做一些并行的事情。 就像一些具有可变状态的单例对象一样。

事情是我不知道我可以在哪里申请演员,我正在调查它。 但我已经有很多同步块在这里和那里。

而且,我相信,已经有迹象表明演员可能会被应用。 (因为我不确定,也许我忘了把一些同步 ,当然也没有集成测试)

关于配置,我只是不确定我是否应该配置一些application.conf让Actrors / Akka在那里( 因为文档本身描述了它 )。

我所看到的:

 @Component("someManager") public class SomeManager { List something; // mutable state, that why I use locks here. // methods: add(), delete(), update() } 

我可以把它SomeManagerActor

SomeManager用于controller 。 因此,拥有控制器Actor会很好吗? 我想收到反馈( onReceive ()方法)。

这有点争议……这是我需要一些例子的另一个原因。

我相信我可以通过摆脱所有synchronized/whait/notify东西,将责任转移到演员,使用消息作为与他们之间的沟通方式来改进应用程序。

或者像这样,它可能是写入属性文件actor

编辑:

例如,现在我发现:为了让Actor1向Actor2发送消息,我使用了一个技巧:

 // somewhere in existing code public void initActors() { ActorSystem system = ActorSystem.create(example"); // initializing final ActorRef actor1 = system.actorOf(Props.create(Actor1.class), "actor1"); } 

Actor1有一个方法preStart() ,只要我引用它就会启动它(上面)。 它向Actor2发送消息:

 @Override public void preStart() { 

但我不确定为什么要初始化两个演员来完成他们的工作。

回答我自己的问题。 只是为了分享我的想法,我想出了什么。

如果我们已经有了基于Servlets / Spring MVC的现有工作Web应用程序,那么在我们的应用程序中,如果在我们的应用程序中,通常没有充分的理由切换到Actors / AKKA (或者将actor引入现有系统)。

  • 没有:当任务分裂在背景上时, 线程工作者逻辑。 (通常典型的Web应用程序没有这个),像长时间的计算..( 并行 )。
  • 有:如果我们有顺序调用 – 当一个组件调用另一个组件时,那么调用另一个组件,其中调用彼此依赖:像控制器调用组件,组件将一些数据保存到某个列表(这是可变的,但是同步为同步列表)。
  • 没有空闲时间来替换Akka演员的所有Spring控制器或根本不使用不同的服务器(不是Tomcat)(没有那么多经理/产品所有者允许你这样做)

在这个简单的系统中有Actors有什么问题:

  • 通过组件获得大量消息 (将命令发送给/来自actor的命令) 而不是调用常规方法 (使用OPP的优点,实现接口,具有多个实现 – 但Actors通常是final class )。

  • 将消息作为string ,也不是好的解决方案 – 因为它很难调试。

  • 在这样的系统(如mvc站点)中,通常没有很多东西需要同步(它已经非常stateless )。 通常每个Controller / Component中有0..2 mutable shared data 。 哪个并不是很难同步(只是养成一个习惯,将同步的所有内容同步到类的顶层(这样状态可识别/本地化)。有时你只需要synchronized collection或使用java Atomic包装器类型。

当Actors可能用于现有应用程序时。 用例可能是这样的:

  • 当我们有长期的搜索时,它会经历几个来源(一种线程工作者)。 有几个/拉MasterActor – > MasterActor (就像它在这里描述的计算PI )。 MasterActor有最终结果。 SiteSearchActor为多个客户计算(在多个站点上搜索)的位置。
  • 或者当我们有任何线程分叉时,从当前的servlet分配出来
  • 当我们确切知道/发现我们的系统将被数百万客户使用时(即使是简单的逻辑),我们应该事先考虑scalabilityperformance
    • 演员真诚 – 我们可以委托一个演员从一个演员到N个演员。
    • 使用线程时,actor保险箱处理器类型( 10000个客户端不需要10000个线程 ,大多数情况下足够有4个线程 (与处理器核心数量相同)

但总的来说,我同意这篇关于concurrencyparallelism文章。 如果我有机会从头开始创建一个应用程序,我会使用没有Servlets容器的 Akka 并在需要使用时以某种方式关注消息 (命令类)和OOP (在一般的Web应用程序中没有那么多的OOP 。我应该无论如何说。但没有人阻止以OOP方式保留一些业务逻辑,演员只是一个沟通粘合剂)。 这比使用JMS更好/更简单。

但就像我说的那样:

Actors / Akka适合:

  1. 服务/控制器(而不是Servlet / SpringMVC)
  2. 线程工作者喜欢逻辑
  3. 特别是对于项目从头开始(当前的基础设施不会让你成为应用演员的障碍)。

我现在唯一的问题是performance comparison 。 假设我们知道:

从性能的角度来看,在一个JVM中拥有10000个线程,并且我们的MVC控制器/服务中的共享可变数据的锁同步和锁定可能非常糟糕。 由于存在许多可能的锁,因此彼此并发(相互竞争或争夺资源的竞争者)的线程。

如果我们对具有N的AKKA / Servlet具有相同的场景(actor,其中N远小于 1000),我们很可能会有更好的性能(因为没有人阻止任何人,除了队列本身,不需要从一个线程切换到另一个)。

但即使拥有一个具有10000个客户端的系统用于基于Servlet的(线程模型)应用程序,使用100个客户端也可以很好地工作。 如果我们有连接池(当然我们有)它与Actor的队列(收件箱)做同样的工作,调度客户端可以访问某些服务。 它可以在K次中提高我们的性能(如果我们没有游泳池那么K就更多了 – 让线程绝望地相互阻挡)。

问题是:

是不是将AKKA应用于现有基于servlet的应用程序的一个很好的理由?

以此为参数:即使在Servler上使用旧系统,使用connection pool也可以将性能提升到良好水平。 这个级别很可能是足够好的,以便不将AKKA应用于现有的Servlet应用程序,比如尝试更改servlet模型(与AKKA之上的控制器相比,这应该是不好的)。

像这样思考是否有意义?

考虑连接拉是一种INBOX(如在AKKA中)调度命令(连接)。

即使Servlets模型很糟糕 (处理来自连接池的连接创建的其余(活动)线程中的锁)。

连接池可能已经足够了,在将akka与基于servlet的东西进行比较时会被遗忘。 我们仍然可以调整我们的应用程序,更改连接池中的MAX-CONNECTION。 通常,我们尽最大努力使应用程序无状态,因此,在大多数情况下,我们不会同步任何东西。

但是,对于整个应用程序而言,只有一个连接池是很糟糕的。 如果与Actors进行比较,则每个actor都有自己的连接池(邮箱),并且每个actor可能负责接受HTTP请求。 那种模式肯定更好。

PS在大多数情况下** 未来 **足够好了。 如果你想要“安全”存储状态(这与Future基本不同),演员是好的。

更新: 有些人认为使用Actors是个坏主意。 有什么好处 – 纯粹的function方法或scalaz已经提供的东西(以及我猜的Haskell ) – 但不适用于远程调用。

我遇到过类似的问题。

我同意将AKKA添加到简单的Web应用程序与少量用户几乎没有什么好处。

但我认为很难将AKKA附加到现有的spring mvc应用程序中。 如果您的项目需要扩展,您可以将@Service层包装到actor中。 因此, @ Controller不需要在actor中。

以下是关于合并spring与akka的演示文稿: https : //www.youtube.com/watch? v = fALUf9BmqYE

演示文稿的源代码: https : //github.com/jsuereth/spring-akka-sample/tree/master/src/main/java/org/springframework/samples/travel