我听说过很多关于Akka框架(Java/Scala服务平台)的狂热,但到目前为止还没有看到很多用例的实际例子.所以我有兴趣听听开发人员成功使用它的事情.
只有一个限制:请不要包括编写聊天服务器的情况.(为什么?因为这被过度使用作为许多类似事物的一个例子)
Akka的新手问题 - 我正在阅读Akka Essentials,有人可以解释一下Akka Stop/Poison Pill与Kill之间的区别吗?这本书只提供了一个小小的解释"杀死同步与毒药是异步的".但是以什么方式?调用actor是否在此期间锁定线程?儿童演员是否在杀人,后停止等情况下被通知?一个概念与另一个概念的使用示例?
非常感谢!
我已经阅读过什么设计决策有利于Scala的Actors而不是JMS的问题和答案?.
通常,我们使用已经存在多年的消息传递解决方案:将诸如WebSphere MQ或Apache ActiveMQ的JMS实现用于点对点通信,或者使用Tibco Rendevous用于多播消息传递.
它们非常稳定,经过验证,可提供高可用性和高性能.然而,配置和设置似乎比Akka复杂得多.
何时以及为什么我应该将Akka用于上述产品(WebSphere MQ或ActiveMQ)到目前为止已成功使用的一些用例?为什么我应该考虑在未来的项目中使用Akka而不是WebSphere MQ或Tibco RV?
什么时候应该避开Akka?它是否提供与其他解决方案相同的高可用性和性能?或者甚至将Akka与其他消息中间件进行比较是一个坏主意?
也许在JVM环境中还有另一个消息传递解决方案除了JMS(点对点),TibcoRV(多播)和Akka之外我还应该考虑?
我最近一直在关注akka,这令人印象深刻.看起来它具有erlang的大部分杀手级功能 - 位置透明度,监督层次结构等等.有没有任何功能erlang有akka没有?
我已经和我一起工作Node.js了一段时间,并认为自己对Java很好.但我刚刚发现Akka并立即对其演员模式感兴趣(据我所知).
现在,假设我的JavaScript技能与我的Scala/Java技能相当,我想专注于任一系统的实用性.特别是在Web服务方面.
据我所知,Node非常适合处理许多并发操作.我想资产管理系统的一个好的Node网络服务可以很好地处理许多用户同时提交更改(在大型,繁忙的流量应用程序中).
但是在阅读了Akka中的演员之后,它会在同样的事情上表现出色.我喜欢将工作量减少到一口大小的想法.此外,多年前我涉足Erlang并爱上了它使用的消息传递系统.
我处理许多处理复杂业务逻辑的应用程序,我认为现在是时候把它们加入到一个或另一个中.特别是升级传统的Struts和C#应用程序.
无论如何,避免神圣的战争,两个系统如何根本不同?它们似乎都面向同一个目标.也许Akka的"自我修复"架构具有优势.
编辑
看起来我正在接近投票.请不要将此问题视为"哪个更好,节点还是akka?".我正在寻找的是事件驱动库(如Node和基于演员的库,如Akka)的根本区别.
我正在开始一个新项目(基于java).我需要将其构建为模块化,分布式和弹性架构.
因此,我希望业务流程能够相互通信,具有互操作性,但也是独立的.
我现在正在寻找两个框架,除了它们的年龄差异外,还表达了两种不同的观点:
选择上述框架之一时我应该考虑什么?
据我所知,到目前为止,Akka仍然以某种方式耦合(在某种程度上我必须'选择'我要发送消息的演员),但非常有弹性.虽然Reactor是松散的(基于事件发布).
有人可以帮我理解如何做出正确的决定吗?
UPDATE
在更好地回顾了Akka 的事件总线之后,我相信Reactor表达的功能已经在某种程度上已经包含在Akka中.
例如,https://github.com/reactor/reactor#events-selectors-and-consumers上记录的订阅和事件发布可以在Akka中表示如下:
final ActorSystem system = ActorSystem.create("system");
final ActorRef actor = system.actorOf(new Props(
new UntypedActorFactory() {
@Override
public Actor create() throws Exception {
return new UntypedActor() {
final LoggingAdapter log = Logging.getLogger(
getContext().system(), this);
@Override
public void onReceive(Object message)
throws Exception {
if (message instanceof String)
log.info("Received String message: {}",
message);
else
unhandled(message);
}
};
}
}), "actor"); …Run Code Online (Sandbox Code Playgroud) 随着Scala 2.9.0的发布,Typesafe Stack也被宣布,它结合了Scala语言和Akka框架.现在,虽然Scala在其标准库中有演员,但Akka使用自己的实现.而且,如果我们寻找其他实现,我们也会发现Lift和Scalaz也有实现!
那么,这些实现之间有什么区别?
我目前正试图开始使用Akka,我面临一个奇怪的问题.我的演员有以下代码:
class AkkaWorkerFT extends Actor {
def receive = {
case Work(n, c) if n < 0 => throw new Exception("Negative number")
case Work(n, c) => self reply n.isProbablePrime(c);
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我开始工作的方式:
val workers = Vector.fill(nrOfWorkers)(actorOf[AkkaWorkerFT].start());
val router = Routing.loadBalancerActor(SmallestMailboxFirstIterator(workers)).start()
Run Code Online (Sandbox Code Playgroud)
这就是我关闭所有东西的方式:
futures.foreach( _.await )
router ! Broadcast(PoisonPill)
router ! PoisonPill
Run Code Online (Sandbox Code Playgroud)
现在发生的事情是,如果我发送工具消息,其中n> 0(没有抛出异常),一切正常,应用程序正常关闭.但是,只要我发送一条导致异常的消息,应用程序就不会终止,因为仍有一个actor正在运行,但我无法弄清楚它来自哪里.
如果它有帮助,这是有问题的线程的堆栈:
Thread [akka:event-driven:dispatcher:event:handler-6] (Suspended)
Unsafe.park(boolean, long) line: not available [native method]
LockSupport.park(Object) line: 158
AbstractQueuedSynchronizer$ConditionObject.await() line: 1987
LinkedBlockingQueue<E>.take() line: 399
ThreadPoolExecutor.getTask() line: 947
ThreadPoolExecutor$Worker.run() line: 907
MonitorableThread(Thread).run() line: …Run Code Online (Sandbox Code Playgroud) 我发现还有一个Akka演员模型,所以我想知道Akka的演员和Scala的演员模特之间有什么区别?
我试图利用Akka的有限状态机框架来处理我的用例.我正在研究一个处理通过各种状态的请求的系统.
此处的请求是需要与其依赖的应用程序一起部署的应用程序名称:
Request for application A -> A is in a QUEUED state
Discover A's dependency B -> B is in a QUEUED state
B is being processed -> B is in a PROCESSING STATE
A is being processed -> A is in a PROCESSING STATE
B is processed -> B is in a DONE state
A is processed -> A is in a DONE state
Run Code Online (Sandbox Code Playgroud)
为此我在发现时初始化有限状态机.所以AFSM是在请求进入时创建的,当从其中一个actor发现B时,FSM被初始化B.
我是否初始化FSM实例并将其传递给所有actor,同时tellFSM是否正在对数据执行操作以使状态机进入正确的状态?
这是状态机的相关部分:
when(QUEUED, matchEvent(requestAccepted.class, MyApp.class, …Run Code Online (Sandbox Code Playgroud)