ses*_*ses 18 java integration akka
如果我已经有java使用spring和servlet容器的现有Web应用程序.将Akka整合到其中的正确方法是什么?
就像我将拥有Actor1并Actor2相互沟通一样.什么是开始使用这些演员的切入点?(比如: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()
}
Run Code Online (Sandbox Code Playgroud)
我能成功 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");
}
Run Code Online (Sandbox Code Playgroud)
Actor1有一个方法preStart(),一旦我引用它就启动(上图).它向Actor2发送消息:
@Override
public void preStart() {
Run Code Online (Sandbox Code Playgroud)
但我不确定为什么要初始化两个演员来完成他们的工作.
ses*_*ses 29
回答我自己的问题.只是为了分享我的想法,我想出了什么.
如果我们已经有了基于Servlets/Spring MVC的现有工作Web应用程序,那么在我们的应用程序中,如果在我们的应用程序中,通常没有充分的理由切换到Actors/ AKKA(或者将actor引入现有系统).
在这个简单的系统中有Actors有什么问题:
通过组件而不是调用一般方法(使用OPP的优点,实现接口,具有多个实现 - 但通常是Actors )拥有大量消息(将命令发送给演员/来自演员的类).final class
将消息作为一个string不好的解决方案 - 因为它很难调试.
在这样的系统(如mvc站点)中,通常没有很多东西可以同步(它已经很完整stateless)了.通常mutable shared data每个控制器/组件中有0..2 .这并不是很难同步(只是习惯于在类的顶部同步所有常见和共享的东西(以便状态可识别/本地化).有时你只需要synchronized collection或使用java Atomic包装器类型.
当Actors可能用于现有应用程序时.用例可能是这样的:
MasterActor- > SiteSearchActor(就像PI 这里描述的计算).MasterActor有最终结果.SiteSearchActor为多个客户计算(在多个站点上搜索)的位置.scalability和performance(
和但总的来说我同意这个文章关于concurrency和parallelism.如果我有机会,使从头开始申请,我会用阿卡没有的Servlet容器和有关的消息不知何故关怀(指挥类)和OOP时需要使用它(有没有这么多OOP在一般的网络应用程序.我应该说无论如何.但没有人阻止保持一些商业逻辑OOP,演员只是一个沟通粘合剂).这比使用JMS更好/更简单.
但就像我说的:
Actors/Akka适合:
我现在唯一的问题是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是个坏主意.有什么好处 - 纯粹的功能方法或scalaz已经提供的东西(以及Haskell我猜) - 但不适用于远程调用.