如果我已有使用java
和spring
容器的现有servlet
网络应用程序。将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()
}
我可以成功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() {
但是我不确定为什么要初始化两个演员才能做到这一点 工作
答案 0 :(得分:28)
回答我自己的问题。只是为了分享我的想法,我想出了什么。
如果我们已经有基于Servlets / Spring MVC的现有工作Web应用程序,那么通常没有充分的理由转换到Actors
/ AKKA
(或者只是为了将演员引入现有系统hack of it)如果在我们的申请中我们:
在这个简单的系统中使用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为多个客户计算(在多个站点上搜索)。scalability
和performance
(
但总的来说,我同意this关于concurrency
和parallelism
的文章。如果我有机会从头开始申请,我会使用Akka 没有Servlets容器和关心消息(命令类)和 OOP 当它需要被使用时(一般的web应用程序中没有那么多OOP
。无论如何我应该说。但没有人阻止以OOP
方式保留一些业务逻辑,演员只是一个沟通粘合剂。这比使用JMS更好/更简单。
但就像我说的那样:
Actors / Akka适合:
我现在唯一的问题是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