Akka官方文档2.5.17(一)——Actor系统

 

目录

Actor系统

层次结构

Configuration Container

Actor最佳实践

你不应该关心的是什么

终止Actor系统


Actor系统

Actors是封装了状态和行为的对象,它们通过交换邮箱里的信息进行交流。从某种意义上来说,Actor是面向对象编程中最严格的形式,但将他们视为人可能会更合适:通过Actor建模解决问题时,想象有一群人并给他们分配子任务,根据他们的功能安排到一个组织结构中合适的位置,并思考如何向上级反应错误(所有这些都是为了不与人打交道,这意味着我们不必关心他们的情绪状态或道德问题)。这些结果可以作为构建软件实现的基本骨架。

Note

一个Actor系统是一个重量级的结构,它会分配1-N个线程,因此每个逻辑应用程序应该只创建一个。

层次结构

类似一个经济组织一样,Actor也是一种层级结构。一个Actor,为了监督程序中的某个功能,可能希望将任务分解为更小、更易于管理的部分。为此目的,它启动由它监督的子Actor。 虽然这里解释了监督的细节,但我们在本节中将集中讨论基本概念。 唯一需要知道的是每个Actor都有一个监督者,即创建它的Actor。

Actor系统的典型特征是任务被切分和委托,直到它们变得足够小以至于可以单一处理。 在这样做的过程中,不仅任务本身的结构清晰,而且可以推断出不同Actors应该处理哪些消息,应该如何正常反应以及应该如何处理失败。 如果一个Actor没有处理某种特定情况的方法,它会向其监督者发送相应的失败消息,寻求帮助。 这种递归结构使得失败能够在正确的层级上得到处理。

将其与分层软件设计进行比较,因为这类设计目的是不泄漏任何故障,所以很容易转变为防御式编程。然而如果将问题传达给合适的人,则可以找到比尝试将所有错误“隐藏”的更好的解决方案。

现在,设计这样一个系统的困难在于如何决定谁应该监督什么。 没有单一的最佳解决方案,但一些指导方针可能会有帮助:

这些规则总存在例外,但无论你是遵守规则还是违反规则,都应该有自己理由。 

 

  • 如果一个Actor管理另一个Actor正在做的任务,例如:传递子任务,那么作为管理的Actor应该监督被管理的Actor。 原因是管理的Actor知道预期会出现哪种故障以及如何处理故障。
  • 如果一个Actor携带非常重要的数据(即,如果可以避免,其状态不会丢失),this actor should source out any possibly dangerous sub-tasks to children it supervises and handle failures of these children as appropriate 。 依赖于请求的性质,最好为每个请求创建一个新子Actor,这样可以简化收集回复的状态管理。 这在Erlang中称为“Error Kernel模式”。
  • 如果一个Actor依赖另一个Actor履行其职责,它应该监控其他Actor的存活并在收到终止通知时采取行动。 这与监督不同,因为监控方对监督者策略没有影响,并且应该注意,单独的功能依赖性并不是决定将某个Actor放置在层次结构中某个位置的标准

Configuration Container

Actor系统作为共同合作的Actors的集合,是管理共享设施(如定时服务,配置,日志记录等)的自然单元。具有不同配置的几个Actor系统可以在同一JVM中共存,因为在Akka里没有全局共享的状态 。 将此与Actor系统之间的透明通信(在一个节点内或通过网络连接)相结合,使得Actor系统本身可以被当作一个构建块。

Actor最佳实践

  1. Actors之间应该像良好的合作伙伴一样:在不打扰别人的情况下高效地完成自己的工作,避免浪费资源。将其转换为编程则意味着通过事件驱动的方式处理事件并生成响应(或者更多请求)。Actor不应该在请求外部实体时阻塞(即在占用线程的情况下被动地等待),这些实体可能是锁、网络套接字等等。除非是在不可避免的情况下,这种情况参见下文。
  2. 不要在Actors之间传递可变对象。为了保证这点,应该使用不可变消息。如果Actor的封装通过可变状态的暴露而破坏时,那么你又回到了Java的并发模式以及其所有的缺点。
  3. Actors是包含了行为和状态的容器,拥抱这种方式意味着不要经常在消息中发送行为(应该倾向于使用Scala闭包)。其中一个风险是意外地在Actor之间共享可变状态,并且这种对Actor模型的违反不幸地破坏了所有使Actor在编程中获得良好体验的特性。
  4. 顶级Actors是Error Kernel最核心的部分,所以要谨慎地创造他们,应该更偏向于层次系统。这有利于故障处理(考虑配置的粒度和性能),而且减轻了Guardian Actor的压力,如果该Actor过度使用的话,将成为系统的争用点。

你不应该关心的是什么

一个Actor系统管理着它配置的所有资源,以便运行它所包含的Actors。在一个系统中可能包含百万多个Actor,毕竟每个Actor仅大约有300字节的开销。当然,大型系统中处理消息的确切顺序对于应用程序作者来说是无法控制的。放轻松,Akka已经把这些都已经封装好了,不需要应用开发者操心。

终止Actor系统

当你的应用程序已经完成使命时,你可以通过调用ActorSystem的terminate方法停止应用程序。该方法的调用会停掉Guardian Actor,反过来它会停掉所有的子Actors、系统Guardian。

如果想在停掉ActorSystem时执行一些操作,请查看 CoordinatedShutdown

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值