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

时间:2013-05-16 19:19:47

标签: java integration akka

如果我已有使用javaspring容器的现有servlet网络应用程序。将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<Some> something;  // mutable state, that why I use locks here.
 // methods: add(), delete(), update()  
}

我可以成功SomeManagerActor

SomeManager来自controller。因此,拥有控制器Actor会很好吗?我希望收到(onReceive()方法)的反馈。

这是一种有争议的......这是我需要一些示例的另一个原因。

我相信我可以通过删除所有synchronized/whait/notify内容,将责任转移给参与者,使用消息作为与他们之间/之间的沟通方式来改进应用程序。

或者像this一样,它可能是写入属性文件的角色

修改

例如,现在我发现:为了让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() {
  

但是我不确定为什么要初始化两个演员才能做到这一点   工作

2 个答案:

答案 0 :(得分:28)

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

如果我们已经有基于Servlets / Spring MVC的现有工作Web应用程序,那么通常没有充分的理由转换到Actors / AKKA(或者只是为了将演员引入现有系统hack of it)如果在我们的申请中我们:

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

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

  • 通过组件而不是调用常规方法(使用OPP的优势,大量消息(将命令发送给演员/来自演员的类))实现接口,有几个实现 - 但Actors通常是final class)。

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

  • 在这样的系统(如mvc网站)中,通常没有很多东西要同步(它已经非常stateless)。通常每个Controller / Component中有0..2 mutable shared data。这并不是很难同步(只是习惯于在类的顶部同步所有常见和共享的东西(以便状态可识别/本地化)。有时您只需要synchronized collection或使用java Atomic包装类型。

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

  • 当我们进行长期搜索时,会经历多个来源(一种线程工作者)。有几个/拉MasterActor - &gt; SiteSearchActor(就像为计算PI here所描述的那样)。 MasterActor有最终结果。 SiteSearchActor为多个客户计算(在多个站点上搜索)。
  • 或当我们有任何线程分叉时,不在当前的servlet中
  • 当我们确切知道/发现我们的系统将被数百万客户使用时(即使是简单的逻辑),我们应该提前考虑scalabilityperformance
    • 演员非常好 - 我们可以将一件作品委托给一个演员到N-one。
    • 使用线程时
    • actors安全处理器类型( 10000个线程 10000个客户端,大​​多数情况下 4个线程(相同)作为处理器核心的金额,请说))

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

但就像我说的那样:

Actors / Akka适合:

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

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

      

    在一个JVM中有10000个线程,同步和锁定共享   我们的MVC控制器/服务中的可变数据可能非常糟糕   从绩效角度来看。既然有很多可能的锁,   并发的线程(仇恨的竞争者或竞争者)   资源)彼此。

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

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

    问题是:

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

      

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

    这样思考是否有意义?

      

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

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

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

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

    P.S。  在大多数情况下** ** Future **就足够了。如果你想要&#34;安全&#34;将状态存储在其中(基本上与Future不同)。

    <强>更新 Some people认为使用Actors是个坏主意。有什么好处 - 纯函数式方法或scalaz已经提供的东西(以及我猜的Haskell) - 但不适用于远程调用。

答案 1 :(得分:3)

我遇到过类似的问题。

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

但我认为将AKKA附加到现有的spring mvc应用程序并不困难。如果您的项目需要扩展,您可以将 @Service 图层包装为actor。 因此, @Controllers 不需要在演员内部。

这是关于合并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