akka概念 学习笔记

博客地址: http://blog.csdn.net/yueqian_zhu/


一、配置

1、Akka的所有配置信息装在 ActorSystem的实例中。在构造一个actor系统时,你可以传进来一个 Config object,如果不传,就相当于传进来 ConfigFactory.load() (使用正确的classloader). 这意味着将会读取classpath根目录下的所有 application.conf, application.json and application.properties 这些文件—请参阅之前推荐的文档以了解细节. 然后actor系统会合并classpath根目录下的 reference.conf 来组成其内部使用的缺省配置

2、如果你编写的是一个Akka应用,把配置放在classpath根目录下的 application.conf 中. 如果你编写的是一个基于Akka的库,把配置放在jar包根目录下的 reference.conf 中.

例子:http://www.gtan.com/akka_doc/general/configuration.html

3、Provider:Provider会随着ActorSystem的初始化而创建。

akka.actor.LocalActorRefProvider (默认,本地场景)

akka.remote.RemoteActorRefProvider (远程调用场景)

akka.cluster.ClusterActorRefProvider (集群场景)

4、一个自定义的 application.conf 可能长成这样:

# In this file you can override any option defined in the reference files.
# Copy in parts of the reference files and modify as you please.
akka {
 
  # Event handlers to register at boot time (Logging$DefaultLogger logs to STDOUT)
  event-handlers = ["akka.event.slf4j.Slf4jEventHandler"]
 
  # Log level used by the configured loggers (see "event-handlers") as soon
  # as they have been started; before that, see "stdout-loglevel"
  # Options: ERROR, WARNING, INFO, DEBUG
  loglevel = DEBUG
 
  # Log level for the very basic logger activated during AkkaApplication startup
  # Options: ERROR, WARNING, INFO, DEBUG
  stdout-loglevel = DEBUG
 
  actor {
    provider = "akka.remote.RemoteActorRefProvider"
    default-dispatcher {
      # Throughput for default Dispatcher, set to 1 for as fair as possible
      throughput = 10
    }
  }
 
  remote {
    netty.tcp {
      port = 2551
    }
  }
}
二、Actor失败处理

1、当一个actor出现失败(i.e. 抛出一个异常),它自己会将自己和自己所有的下属挂起然后向自己的监管者发送一个提示失败的消息。

2、一个actor的缺省行为是在重启前终止它的所有下属,但这种行为可以用 Actor 类的 preRestart hook来重写;对所有子actor的递归重启操作在这个hook之后执行。

3、actor重启步骤:

(1)actor被挂起

(2)调用旧实例的 supervisionStrategy.handleSupervisorFailing 方法 (缺省实现为挂起所有的子actor)

(3)调用旧实例的 preRestart hook (缺省实现为向所有的子actor发送终止请求并调用 postStop)

(4)等待所有子actor终止直到 preRestart 最终结束

(5)调用旧实例的 supervisionStrategy.handleSupervisorRestarted 方法 (缺省实现为向所有剩下的子actor发送重启请求)

(6)再次调用之前提供的actor工厂创建新的actor实例

(7)对新实例调用 postRestart

(8)恢复运行新的actor

重启不影响邮箱的内容,所以对消息的处理将在postRestart hook返回后继续,触发异常的消息不会被重新接收。

4、actor实现Terminated消息来获知子actor的存活情况,默认是throw DeathPactException

5、一个actor可以通过stop或者PoisonPill消息,Kill消息来终止。调用stop之后会调用子actor的stop,并等待他们终止,最后执行postStop。如果当前有正在处理的消息,对该消息的处理将在actor被终止前完成,但是邮箱中的后续消息将不会被处理。缺省情况下这些消息会被送到ActorSystem的deadletter,但是这取决于邮箱的实现。而PoisonPill消息会进入正常的邮箱,在此消息之前的消息会正常的执行完,而它的监管者会收到Terminated消息。收到Kill消息的actor会抛出ActorKilledException,并传播到监管者中。

三、监管策略

Akka中有两个策略,分别是:OneForOneStrategy 和 AllForOneStrategy。它们都通过一个mapping将异常类型映射到不同的处理机制(stop,restart等),并且规定了它们最多可以出现异常多少次,如果次数超过了阈值就会被terminate。二者不同的是前者只针对异常的actor采用设定好的处理机制,而后者会将处理机制应用到所有的同辈(兄弟)actor。正常情况下你应该采用OneForOneStrategy,而且这也是Akka默认采用的机制。

四、actor路径

1、逻辑actor路径/物理actor路径:顺着actor的父监管链一直到根的唯一路径被称为逻辑actor路径。每一个actor同时还有一条物理路径,从实际的actor对象所在的actor系统的根开始的。跟其它actor通信时使用物理路径作为发送方引用能够让接收方直接回复到这个actor上,将路由延迟降到最小。

2、绝对路径 vs 相对路径:在任何一个actor实例中可以用context.actorFor访问。它所返回的actor引用与ActorSystem的返回值非常类似,但它的路径查找是从当前actor开始的,而不是从actor树的根开始。可以用 ".." 路径来访问父actor。

五、actor引用

1、在根actor上使用ActorSystem.actorOf创建actor,然后使用ActorContext.actorOf从创建出的actor中生出actor树来启动的

2、查找actor引用的途径是使用ActorSystem.actorFor方法,它会返回一个(未验证的)本地、远程或集群actor引用。向这个引用发送消息或试图观察它的存活状态会在actor系统树中从根开始一层一层从父向子actor发送消息,直到消息到达目标或是出现某种失败。在实际中这个过程会使用缓存来优化,但相较使用物理actor路径来说仍然增加了开销,因为物理路径能够从actor的响应消息中的发送方引用中获得

六、远程操作

当一个actor创建一个子actor,actor系统的部署者会决定新的actor是在同一个jvm中或是在其它的节点上。如果是后者,actor的创建会通过网络连接来到另一个jvm中进行,结果是新的actor会进入另一个actor系统。新的actor的监管者会是一个远程actor引用(代表会触发创建动作的actor)。这时,context.parent(监管者引用)和context.path.parent(actor路径上的父actor)表示的actor是不同的。

七、垂直扩展

通过并行增加actor子树的方法来垂直扩展到多个cpu核上。新增出来的子树可以使用不同的方法来进行路由。开发者只需要声明一个“withRouter”的actor,这样创建出来的actor会生成一些具有所期望的类型的数目可配置的子actor,并使用所配置的方式来对这些子actor进行路由。

八、消息投递保证

akka没有投递保证,所以可能会“没有”,或有“一些”,或“全部”消息到达。但是次序是针对每一个发送者维护的。


参考:http://www.gtan.com/akka_doc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值