最近我开始使用支持演员/代理/无共享架构的替代语言 - 即.scala,clojure等(clojure也支持共享状态).
到目前为止,我所阅读的大部分文档都集中在介绍级别.我正在寻找的是四人帮中更高级的文档,而不是基于什么共享.
为什么?它有助于改变设计思维的变化.简单的例子很简单,但在现实世界的Java应用程序(单线程)中,您可以拥有1000个具有复杂关系的成员的对象图.但是,基于代理的并发开发,它在设计大型系统时引入了一整套全新的思路.即.代理粒度 - 一个代理应管理多少状态 - 对性能的影响等,或者是将共享状态对象图映射到基于代理的系统的良好模式.将域模型映射到设计的技巧.讨论不是关于技术,而是关于如何在设计中最好地使用该技术(现实世界"复杂"的例子会很棒).
现在我正在看Play Framework并且喜欢它.在Play中提供的功能广告之一是Akka.
为了更好地了解Akka以及如何正确使用它,您能告诉我其他语言或产品有哪些替代品?
RabbitMQ与它相比如何?有很多重叠吗?将它们一起使用是否实用?在什么用例?
在阿卡测试文档提供以下方法来创建TestActorRef:
import akka.testkit.TestActorRef val actorRef = TestActorRef[MyActor]
如何扩展它以测试带有构造函数参数的现有actor?当我尝试按原样运行时,在我的actor类中替换,我收到以下错误:
"错误而创建的演员akka.actor.ActorInitializationException:无法实例演员
确保演员不是类/特征中定义的,
如果是的话就把它的类/特性外,铁的陪伴对象,
或试图改变:"actorOf (道具[MyActor]'到'actorOf(道具(新的MyActor)'."
我可以想到在方括号内的类名后添加args的各种想法都会崩溃和烧毁.
我有一个java对象,它不是一个使用actorSelection(Path)从actor系统中选择actor的actor.系统中可能存在所选的actor.
在Java Api中,ActorSelection不存在ask(),因此我无法向actor选择发送和识别消息并使用响应的发送者.
我试图通过演员选择向演员发送消息然后对deadletter做出反应来解决问题.但我没有任何动静.
如果演员是活着还是不存在,我如何检查ActorSelection?
ActorSystem system = ActorSystem.create("test");
//create test actor
system.actorOf(Props.create(TestActor.class), "testActor");
//add dead letter listener to the system
ActorRef eventBusActor = asys.actorOf(Props.create(EventBusActor.class), "eventbusactor");
system.eventStream().subscribe(eventBusActor, DeadLetter.class);
//This works. The test actor receives the message
ActorSelection a1 = asys.actorSelection("/user/testActor");
a1.tell("hello", ActorRef.noSender());
//This does not work and does not send dead letters
ActorSelection a2 = asys.actorSelection("/user/doesnotexist");
a2.tell("hello", ActorRef.noSender());
//Does not compile, because ask needs an ActorRef as first argument
ActorSelection a3 = asys.actorSelection("/user/test");
Future f = Patterns.ask(a3, new Identify(), 1000);
Run Code Online (Sandbox Code Playgroud) 我正在试图找出如何在使用actor系统时最好地处理数据库操作.事实上,当我们尝试不阻止AKKA时,数据库操作正在阻塞.
我在主文档中指出,处理这种情况的一种方法是在路由器后面创建一个actor池,可能在一个单独的executionContext上,它将处理数据库访问.
因此,我有以下问题:
1 - databaseActors是否始终保持连接打开状态?
2 - 它如何与许多数据库提供的连接池一起工作?
3 - 我们应该将两者结合起来,并让DatabaseActors在每次请求时从池请求一个新的连接.如果没有,是不是一直保持连接打开是一件坏事?
4 - 有人可以向我解释微妙的事情,使其成为一种避免线程饥饿的方法.例如,使用Play或spray,请求的处理是异步任务,但是如果该任务需要数据库访问并且我们向DatabaseActor发送请求,那么数据库Actor上的块(如果它发生)不会导致,异步任务中的一个块,导致可能的线程不足?
5 - 100%确定DB ACID属性确保多次读写的安全性,因此在关系之前发生.
6 - 我正在使用也称为三重存储的语义数据库,并在我的请求中大量使用语义推理功能.我还执行了很多写访问,任何建议,关于池和actor编号或专用执行上下文的调整参数?
最好,
中号
我正在寻找一个TPL数据流块解决方案,它可以容纳多个项目,可以链接到多个目标块,但是它能够将项目转发到仅通过过滤器/谓词的特定目标块.在任何时候都不应该将项目同时传递到多个目标块,始终只能传递给与过滤器匹配的项目,或者可以丢弃该项目.我不喜欢BroadCastBlock,因为如果我理解正确,它不能保证传送(或者是吗?)并且过滤是在目标块侧完成的,这意味着BroadCastBlock基本上将每个项目的副本发送到所有linkedTo目标块.如果我理解正确,它也不会在任何时候持有多个项目.我不想使用Post/Async但维护LinkTo链.
有没有办法绕过完整的自定义数据流块?或者我误解了BroadCastBlock的工作原理?不幸的是,实际上没有太多文档可以详细介绍并涵盖用例.任何想法都受到高度赞赏.
我有两个Akka演员以同样的方式回复一些消息,但其他人以不同的方式.它们都响应同一组消息.想知道如何使用他们的接收方法设计我的两个演员,通过继承,镇定等?我尝试将其他特征的部分函数与"orElse"链接在一起,遗憾的是,它将类暴露给它的特征功能,而且我不确定特征的接收如何能够轻松访问actor的上下文.一个直接的,模块化的解决方案将是理想的,但我想知道这是否是一个解决的问题?
有没有办法将依赖项注入Azure Service Fabric Actor的构造函数?
据我所知,actor基本上是在线程上实现的轻量级线程,在一小部分共享线程上运行许多actor.
鉴于这种情况,在actor中使用阻塞操作会阻塞底层线程.这不是一个正确性问题,因为actor库会根据需要产生更多线程(是吗?)但是最后你会遇到很多线程,从而否定了首先使用actor的好处.
鉴于此,当您需要执行此类IO操作时,演员如何工作?是否存在"actor-block"的操作,在让线程继续执行其他操作时暂停actor(就像阻塞操作在让CPU继续执行其他操作时暂停线程一样),或者是所有用CPS编写的链接,链接演员?或者演员根本不适合这种长期运行?
背景:我有经验编写多线程东西的经验,并且了解CPS /事件循环如何工作,但绝对没有与演员合作的经验,只想在高水平上了解他们如何适应,在我潜水之前进入代码.
当调用?或ask在Akka Actor上时,Future[Any]返回a并且我必须通过显式转换future.mapTo[MyType].
我不喜欢失去这种类型的安全.如果我直接使用Futures(没有演员)我可以明确地返回Future[MyType]并保持类型安全.
我的具体用例涉及一个演员将其消息委托给两个子演员,然后汇总这些演员的结果并将其返回给父母的发件人.我父母的接收方法与Akka Docs中的这种方法类似:
http://doc.akka.io/docs/akka/2.0/scala/futures.html#For_Comprehensions
val f1 = actor1 ? msg
val f2 = actor2 ? msg
val f3 = for {
a ? f1.mapTo[Int]
b ? f2.mapTo[Int]
c ? ask(actor3, (a + b)).mapTo[Int]
} yield c
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来实现我的用例?
actor ×10
akka ×6
scala ×6
c# ×2
agent ×1
asynchronous ×1
concurrency ×1
erlang ×1
future ×1
java ×1
rabbitmq ×1
testing ×1
tpl-dataflow ×1
traits ×1