图中表示的是一个Actor System,它显示了在这个Actor System中最重要实体之间的关系。
什么是actor,是一个封装了状态和行为的对象,每个actor都通过message交流,从自己的mailbox中读取别的actor发送的消息。
注意
:
ActorSystem是重量级的对象,会创建1...N个线程,所以一个application一个ActorSystem。
层次结构
假设有一个actor,它的一个功能过于复杂,为了降低复杂度,可以将这个功能划分成多个更小粒度的,更易管理的子任务,启动新的child actors,监控它们任务运行(关于监控,详见here)。每一个actor的创建者,也是其监控者。
设计一个actor system,我们要正确规划,哪一个actor负责监控,监控什么。几点建议如下:
- 负责分发工作的actor,管理接受任务的actor,因为包工头知道所有任务出错了该怎么解决 :)
- 拥有重要数据的actor,找出所有可能丢失该数据的子actor,监控,并处理它们的错误。类似Erlang的Error Kernel Pattern。(这段看不太明白)
- 如果一个actor需要其他的actor传递其需求或职责,必将监控之。它应该查看其他actor的存活状态,已经是否完成完成任务,当然这不是监控范畴了,不涉及到监控策略
以上仅做参考 -..-,总有例外
Actor Path
可以认为Actor Path是通过字符串对Actor层级关系进行组合用以标识唯一Actor的一种方式。我们在创建Actor Path时,不用创建Actor;但如果没有创建对应的Actor,则不能创建Actor Reference。还可以创建一个Actor,再终止它,然后再以相同的Actor Path再创建一个新的Actor。新创建的Actor是Actor的新化身(Incarnation),但与旧的Actor并不是同一个。对于这个新化身而言,持有旧Actor的Actor Reference并不是有效的。消息发送给旧的Actor Reference,但不会被传递给新化身,即使它们具有相同的路径。
Actor Path包含协议、位置和actor的层级。如下是一些Actor Path的实例:
//purely local
"akka://my-sys/user/service-a/worker1"
// remote"akka.tcp://my-sys@host.example.com:5678/user/service-b"
//clustered (Future Extension)"cluster://my-cluster/service-c"
有两种方式可以获得Actor Reference:创建Actor或查找。
要创建Actor,可以调用ActorSystem.actorOf(),它创建的Actor在guardian actor之下;接着可以调用ActorContext.actorOf()在刚才创建的Actor内生成Actor树。这些方法会返回新创建的Actor的引用。每个Actor都可以直接访问Actor Context来或得它自身、Parent以及所有Children的引用。
要查找Actor Reference,则可调用ActorSystem.actorSelection()方法。要获得限定到特定Actor的生命周期中的ActorRef,可以使用sender引用来发送一条消息如内建的Identity消息给Actor。
在查找ActorRef时,可以使用绝对路径或相对路径。如果是相对路径,可以用两个点(..)表示parent actor。例如:
context.actorSelection("../brother") ! msg
使用绝对路径的例子:
context.actorSelection("/user/ServiceA") ! msg
还可以使用通配符查询逻辑的Actor层级,例如下面的例子就是发送消息给除当前Actor之外的所有同级Actor(因为..代表parent,所以这里就意味找当前Actor的parent的下级Actor):
context.actorSelection("../*") ! msg
区别:actorOf vs. actorSelection vs. actorFor
- actorOf:创建一个新的Actor。创建的Actor为调用该方法时所属的Context下的直接子Actor;
- actorSelection:当消息传递来时,只查找现有的Actor,而不会创建新的Actor;在创建了selection时,也不会验证目标Actors是否存在;
- actorFor(已经被actorSelection所deprecated):只会查找现有的Actor,而不会创建新的Actor。
远程部署的相互影响
当一个Actor创建一个Child时,Actor的系统部署器会决定这个新的Actor究竟属于同一个JVM,还是另一个节点。如果是后一种情况,Actor的创建就会通过在不同JVM的网络连接而触发,这属于不同的Actor系统。远程系统会将新的Actor放在一个特定的路径下,且新Actor的Supervisor应该是一个远程的Actor引用。而且,context.parent(Supervisor的引用)与context.path.parent(actor path的父节点)表示的不是同一个Actor。如下图所示:
注意图中展现的两个不同的Actor系统之间的Route关系。在左边的Actor系统中,Child Actor属于Remote ActorRef,它指向了右边远端Actor系统中的一个Actor节点,该Actor对于右边的Actor系统而言,属于Local ActorRef,但它的Parent Actor却是一个Remote ActorRef,它指向了左边对应的Local ActorRef。
Actor Path的Top-Level Scopes
Actor路径的根为”/”,而后续层级包括:”/user”, “/system”, “deadLetters”, “/temp”, “/remote”。
这里体现了Akka遵循“简单”原则的设计目标:层级中的任何事物都是Actor,且所有Actor的功能都采用同样的方式。
Actor最佳实践
- actors尽量不要阻塞
- actors间不要传递可变对象
- actor的state,behavior作为可变对象,是不能在actors中传递
- Top-level actors尽量少创建(没看懂 T T)
阻塞需要谨慎管理
很多种情况,需要重新细看,分析
我们不需要关心什么
actor会自动管理我们分配的固定资源。一个actor system可能有上百万个actors,毕竟actor是非常轻量级的,每个实例只占300字节。
http://blog.csdn.net/wsscy2004/article/details/38233139
相关推荐
Maven坐标:com.typesafe.akka:akka-actor_2.11:2.5.19; 标签:typesafe、akka、actor、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译...
Maven坐标:com.typesafe.akka:akka-actor_2.11:2.5.19; 标签:typesafe、akka、actor、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化...
另外,本书介绍了 Actor 模型的一个实现框架 Akka 以及它的工具,而后讨论了在充分利用 actor 架构的基础上使用 Akka 框架来设计软件系统的方法,以及使用它来开发并发性和分布式应用程序的方怯。本书还介绍了领域 ...
理解Actor如何工作,以及它们如何与其他Actor交互,是学习Akka的基础。 2. **并发与并行**:Akka通过Actor系统提供了高度并行的环境,帮助开发者构建能够充分利用多核处理器能力的应用。书中会讲解如何设计和实现...
Maven坐标:com.typesafe.akka:akka-actor_2.11:2.5.21; 标签:typesafe、akka、actor、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译...
总的来说,这个简单的Scala Akka Actor demo提供了一个学习Akka和Scala并发编程的实践平台,可以帮助开发者更好地理解和应用Akka框架。通过这个示例,可以深入理解Actor模型的优势,以及如何在实际项目中利用它来...
Maven坐标:com.typesafe.akka:akka-actor_2.11:2.4.20; 标签:typesafe、akka、actor、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化...
spark,akka,actor工具类,版本2.11;akka.actor override def receive: Receive = { case mess: Message => { if (mess.message.equals("")) { println(mess.message) } } }
《Akka Typed Actor详解——基于1.0-RC2.jar版本》 在Java和Scala的世界里,Akka是一个强大的工具库,它提供了构建高度可扩展、反应式应用程序的框架。Akka Typed Actor是Akka框架中的一个重要组件,它是对传统...
Maven坐标:com.typesafe.akka:akka-actor_2.11:2.4.20; 标签:typesafe、akka、actor、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译...
5. Akka应用模式:Akka框架和Actor模型有其特定的模式和最佳实践,这些模式能够帮助开发者更有效地使用Akka构建高性能的分布式系统。书中将介绍一系列Akka应用模式,帮助开发者理解如何在不同场景下应用Actor模型和...
Maven坐标:com.typesafe.akka:akka-actor_2.11:2.5.21; 标签:typesafe、akka、actor、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化...
akka-actor_2.11 jar包
用于 actor系统的可插拔监视系统工具。 火卫一vs.阿卡。 2018年, 的制造商Petabridge 。 Phobos比Akka具有更全面的功能。 不需要用户用任何代码来修饰其参与者-监视和跟踪自动进行; 开箱即用地支持大量公制和...
- **基础概念**:Actor 模型是一种并发计算模型,其中 Actor 作为独立单元处理任务。每个 Actor 通过消息传递与其他 Actor 进行通信。 - **优点**: - **隔离性**:每个 Actor 都有自己的状态,它们之间的交互仅...
《Akka Actor 1.1.2:构建高效并发应用的核心组件》 在现代软件开发中,处理并发和分布式计算已经成为一个重要的挑战。Akka,一个由Lightbend公司维护的开源框架,提供了强大的工具来解决这些问题。尤其值得一提的...
其中包括:Actor模型和响应式软件的主要概念、Scala语言的基础知识、Akka框架与Akka集群功能、Actor模型中的通道机制和技术、降低消息源与消息目的地之间耦合性的方式、持久化Actor对象和幂等接收者。附录A中还介绍...
- **Actor**:Actor是Akka的基本构建块,每个Actor都是一个独立的执行单元,拥有自己的状态,并通过异步消息通信与其他Actor交互。 - **消息传递**:Actor之间通过发送消息进行通信,避免了共享状态,减少了竞态...
2. **Actor**:Actor是Akka中的基本工作单元,它有自己的状态和行为。每个Actor通过消息传递与其他Actor通信,确保线程安全。Actor之间不会共享状态,减少了并发编程中的复杂性。 3. **消息传递**:Actor之间的通信...