`
沉沦的快乐
  • 浏览: 56860 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

akka学习之actor系统介绍

 
阅读更多

actor系统

      前面讲过actor其实是封装了状态和行为的对象,actor之间唯一的通信方式是通过接收者的邮箱交换信息。为了更好的了解actor系统,可能把它类比为人群会更好理解些。在使用actor来对解决方案建模时,把actor想象成一群人,把子任务分配给他们,将他们的功能整理成一个有组织的结构,同时考虑将失败情况向上级汇报。这样的就可以在脑中形成进行软件实现的框架。actor系统是一个可分配N个线程的重量级的结构,因此在一个逻辑应用中只创建一个actor系统。

层级结构

      一个actor可能会把任务拆分成更细粒度的子任务,并且管理他们。actor系统一个典型的特点就是把任务尽量拆得足够小,然后为这些小任务定义和创建actor。在任务拆分的时候,每个子任务要结构明确,功能紧凑,这样才能根据任务去构建actor处理消息的方法,正常的消息交互,以及如何处理错误。如果一个actor没有处理某个状况的方法,那么它会发送相应的错误消息给它的监护者,如果监护者不能处理,则递交给监护者的监护者处理,这种递归结构基本能保证错误在合适的层次上被处理掉。相比于传统的在可能出错的地方去穷举可能的错误,并进行处理,以防止错误泄露出去,akka的这种把错误统一交给合适的人去处理会是一个更加好的解决办法。

     这样的错误处理方案好是好,但是问题的难点是哪个actor应该监管什么,这个没有一个最好的解决方案,需要根据系统的实际情况来设计,下面是几条在实际应用中可能有帮助的建议:

1.如果一个actor需要管理另外一个actor要做的工作,比如传递子任务等,这时候管理者应该监控子actor。因为管理者可能预期得到子actor会遇到什么样的错误,并知道如何去处理。

2.如果一个actor带有非常重要的信息,这个actor应该把可能的危险任务交给他监管的子任务去处理,然后处理子actor可能出现的错误。视请求的性质,可能最好是为每一个请求创建一个子actor,这样能简化收集回应时的状态管理。这在Erlang中被称为“Error Kernel Pattern”。

3.如果一个actor依赖于其他actor来执行自己的任务,它必须监控所依赖的actor的生命周期,对依赖的actor发送过来的终止消息作出响应。在这里监管(supervision)和监控(watching)有不同的含义,监控方不影响监管策略。同时必须注意的是,仅仅是功能上的依赖不能决定一个子actor在整个系统中处于哪个层次。

 

配置容器

      actor系统是一个由许多actor对象组成的系统,这个系统管理着所有actor共享的基础设施,比如定时服务,配置,日志等等。使用不同的配置的多个actor系统可以在同一个jvm中共存而不会发生问题akka本身没有全局共享的状态。将这与actor系统之间的透明通讯(在同一节点上或者跨网络连接的多个节点)结合,可以看到actor系统本身可以被作为功能层次中的积木构件。

 

actor最佳实践

1.actor应该就像最好的同事那样:大家各自高效地做自己的事情,而不会干扰其他人的工作,同时也尽量避免占用资源,比如cpu,线程,内存等等。更具体的编程来说,就是通过事件驱动的方式来处理任务和产生响应。actor处理任务的时候尽量不应该被某些外部实体阻塞,比如锁,网络socket等等。

2.actor之间的传递消息时不要用可变对象,最好定义不可变类型的消息(比如String类型)。如果把actor对象内部的可变状态传递给了外部,那么你又回到了传统的java并发编程模式,陷入无休止的锁,同步等等的泥潭中。

3.actor是封装了行为和状态的容器,因此不要在消息中把actor的行为传递出去,如果这样做,就有可能把actor的可变状态共享出去了,同时actor模型的隔离性也被打破了。

4.顶层actor是错误内核中最重要的一部分,因此需要谨慎的设计顶层系统,最好使用真正的分层设计的方式来设计他。这有助于实现错误处理,同时减少守护actor的压力。

 

阻塞需要谨慎地处理

在上面第一条中说过要尽量避免阻塞,但是在某些操作中阻塞是不可避免的。比如在不确定的时间让现场休眠,并等待外部事件的发生。比较普遍的阻塞场景主要有数据库操作,消息API,网络IO等。当面对这种场景的时间,你可能会尝试把阻塞调用封装在Future中,但是这种策略稍嫌简单了些,而且会引发潜在的问题:可能很快就遇到了性能瓶颈,或者当阻塞严重时会load升高时,同时无限的创建线程,并最终导致OOM。下面给出几种常见的处理阻塞问题的建议:

1.使用actor来做阻塞调用,并通过配置线程池以及线程池的大小来处理actor。

2.使用Future来做阻塞调用,但是要确保并发线程数的上限,如果没有限制,可能会导致OOM或者超过系统的线程上限。或者也使用线程池来处理Future。

3.创建一个管理线程来管理阻塞资源,并且分派事件,就像NIO的selector管理多channel一样。

     最好通过akka提供的application.conf文件来配置线程池。

 

分享到:
评论

相关推荐

    akka-actor_2.11 jar包

    akka-actor_2.11 jar包

    akka-actor-2.11-2.5.19-API文档-中文版.zip

    赠送jar包:akka-actor_2.11-2.5.19.jar; 赠送原API文档:akka-actor_2.11-2.5.19-javadoc.jar; 赠送源代码:akka-actor_2.11-2.5.19-sources.jar; 赠送Maven依赖信息文件:akka-actor_2.11-2.5.19.pom; 包含...

    akka-actor_2.11-2.5.19-API文档-中英对照版.zip

    赠送jar包:akka-actor_2.11-2.5.19.jar; 赠送原API文档:akka-actor_2.11-2.5.19-javadoc.jar; 赠送源代码:akka-actor_2.11-2.5.19-sources.jar; 赠送Maven依赖信息文件:akka-actor_2.11-2.5.19.pom; 包含...

    用Scala写的akka actor简单demo

    标题中的“用Scala写的akka actor简单demo”指的是一个使用Scala编程语言编写的Akka Actor系统的基本示例。Akka是轻量级、基于actor模型的框架,它用于构建高度并发、分布式和容错的应用程序。Scala是多范式编程语言...

    akka-actor-1.0-RC2.jar.zip

    Akka的核心组件之一就是Actor系统,这是一个设计模式,用于处理并发和并行计算。在Akka中,Actors通过消息传递进行通信,而非共享状态,这种模型极大地简化了多线程编程中的同步问题。`akka-actor-1.0-RC2.jar`是这...

    akka-actor-1.1.2.jar.zip

    Akka Actor系统是基于消息传递的并发模型,它将Actor作为计算的基本单元。每个Actor都有自己的状态,并通过发送消息与其他Actor通信,这样可以避免共享状态,减少竞态条件,提高系统的可伸缩性和容错性。Akka 1.1.2...

    akka-actor_2.13-2.6.1.jar

    Akka是JAVA虚拟机JVM平台上构建高并发、分布式和容错应用的工具包和运行时。Akka用Scala语言写成,同时提供了Scala和JAVA的开发...Akka处理并发的方法基于Actor模型。在Akka里,Actor之间通信的唯一机制就是消息传递。

    akka-actor_2.12 jar包

    akka-actor_2.12 jar包

    akka-typed-actor-1.0-RC2.jar.zip

    Akka Typed Actor是Akka 2.5版本之后引入的新特性,它旨在解决原始Actor系统中可能出现的类型不安全问题。在传统的Actor模型中,消息传递是通过继承自`AnyRef`的任意对象进行的,这可能导致类型混淆和运行时错误。...

    akka-actor_2.11-2.5.21-API文档-中文版.zip

    赠送jar包:akka-actor_2.11-2.5.21.jar; 赠送原API文档:akka-actor_2.11-2.5.21-javadoc.jar; 赠送源代码:akka-actor_2.11-2.5.21-sources.jar; 赠送Maven依赖信息文件:akka-actor_2.11-2.5.21.pom; 包含...

    akka-actor_2.11-2.4.20-API文档-中英对照版.zip

    赠送jar包:akka-actor_2.11-2.4.20.jar; 赠送原API文档:akka-actor_2.11-2.4.20-javadoc.jar; 赠送源代码:akka-actor_2.11-2.4.20-sources.jar; 赠送Maven依赖信息文件:akka-actor_2.11-2.4.20.pom; 包含...

    响应式架构 消息模式Actor实现与Scala.Akka应用集成

    在"响应式架构 消息模式Actor实现与Scala.Akka应用集成"这个主题中,我们可以深入学习如何使用Scala和Akka构建响应式的系统。这可能包括以下知识点: 1. Actor系统的创建和配置:理解如何在Scala中初始化一个Akka ...

    akka-viz, Akka actor系统的可视化调试器( wip ).zip

    akka-viz, Akka actor系统的可视化调试器( wip ) akkaAkka actor系统( 实验)的可视化调试器。 当前版本是基于 akka 2.4.10构建的。下载最新版本为: 要开始,你需要为"监视"jar 添加依赖项:resolvers = Resolver

    响应式架构++消息模式Actor实现与Scala.Akka应用集成+,沃恩·弗农+

    通过阅读这本书,开发者不仅可以学习到如何使用Scala和Akka构建响应式系统,还能理解如何利用消息模式和Actor模型来解决并发问题,提升系统的弹性和可靠性。对于想要深入理解并发编程和分布式系统的人来说,这是一本...

    Akka Scala 学习高清原版pdf

    - 介绍了Akka的基础概念,例如什么是actor?actor是Akka中处理消息的最小单元。 - actor系统是多个actors构成的分布式计算环境。 - actor引用、路径和地址用于在分布式系统中定位和管理actors。 - 监督和监控...

    akka-actor_2.11-2.5.23.jar

    spark,akka,actor工具类,版本2.11;akka.actor override def receive: Receive = { case mess: Message => { if (mess.message.equals("")) { println(mess.message) } } }

    akka-actor_2.13-2.6.5.jar

    Akka是JAVA虚拟机JVM平台上构建高并发、分布式和容错应用的工具包和运行时。Akka用Scala语言写成,同时提供了Scala和JAVA的开发...Akka处理并发的方法基于Actor模型。在Akka里,Actor之间通信的唯一机制就是消息传递。

    Akka Actor Tutorial代码

    **Akka Actor 概述** Akka 是一个用于构建高度并发、分布式和反应式应用程序的框架,主要在Java和Scala语言环境下使用。它基于Actor模型,该模型将...学习和掌握Akka Actor对于开发高可用、可扩展的应用程序至关重要。

    akka-actor_2.11-2.4.20-API文档-中文版.zip

    赠送jar包:akka-actor_2.11-2.4.20.jar; 赠送原API文档:akka-actor_2.11-2.4.20-javadoc.jar; 赠送源代码:akka-actor_2.11-2.4.20-sources.jar; 赠送Maven依赖信息文件:akka-actor_2.11-2.4.20.pom; 包含...

Global site tag (gtag.js) - Google Analytics