文档章节

Akka系统《sixteen》译

woshixin
 woshixin
发布于 11/13 23:46
字数 1530
阅读 6
收藏 0

Actor是一个封装状态(state)和行为(behavior)的对象,它们只通过交换消息通信(放入收件人邮箱的邮件)。从某种意义上说,Actor是最严格的面向对象编程形式,但它更适合将他们视为人:在与Actor建模解决方案时,设想一群人并为他们分配子任务,将他们的功能安排到一个组织结构,并思考如何处理失败。

ActorSystem是一个重量级结构,它将分配1 ... N个线程,因此每个逻辑程序创建一个。

层次结构

就像在经济组织中一样,Actor自然形成等级制度。程序中某个功能的一个Actor可能希望将其任务分解为更小,更易于管理的部分。为此目的,它启动它监督的子Actor。

虽然解释了监督的细节,但我们将集中讨论一些基本概念。唯一的先决条件是要知道每个Actor都有一个主管,即创建它的Actor。

Actor系统的典型特征是任务被分割和委派,直到它们变得足够小以便一体化处理。在这样做的过程中,不仅任务本身结构清晰,而且可以根据他们应该处理哪些消息,他们应该如何正常反应以及如何处理失败。如果一个Actor没有处理某种情况的手段,它会向其主管发送相应的失败消息,寻求帮助,递归结构允许在高的级别处理失败。

相比之下,分层软件设计很容易转化为防御性编程,目的是不泄漏任何故障。如果问题传达给合适的人,可以找到一个更好的解决方案,而不是试图保持一切“在地毯下”。

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

  • 如果一个Actor管理另一个Actor正在做的工作,例如通过传递子任务,父级别应该监督子级别。原因是父级别知道预期会出现哪种故障以及如何处理故障。
  • 如果一个Actor携带非常重要的数据(其状态不能丢失),该Actor应该向其监督的子Actor提供任何可能危险的子任务时,并在适当时处理这些子的失败。根据请求的性质,最好为每个请求创建一个新子项,这样可以简化收集回复的状态管理。这被称为Erlang的“Error Kernel Pattern”。
  • 如果一个Acot依赖另一个Actor履行其职责,它应该观察其他Actor的活动并在收到终止通知时采取行动。这与监督不同,因为观看方对主管策略没有影响。

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

配置容器

Actor系统作为互相协作Actor集合,Actpr管理共享设施(如调度服务,配置,日志记录等)的自然单元。具有不同配置的几个actor系统可以在同一JVM中共存而没有问题,没有全局共享状态在Akka本身。将此与Actor系统之间的透明通信(在一个节点内或通过网络连接)相结合,以查看Actor系统本身可以用作功能层次结构中的构建块。

Actor Best Practices

  1. Actos应该像好伙伴一样:高效地完成工作而不必费心地打扰其他人,避免占用资源。转换为编程这意味着以事件驱动的方式处理事件并生成响应(或更多请求)。参与者不应该阻止(即在占用线程时被动地等待), 可能是锁,网络套接字等 ,除非它是不可避免的;在后一种情况下见下文。
  2. 不要在Actor之间传递可变对象。为了确保,更喜欢不可变的消息。如果通过将其可变状态暴露给外部来破坏actor的封装,那么您将回到正常的Java并发领域,并具有所有缺点。
  3. 使Actor成为行为和状态的容器,这意味着不要经常在消息中发送行为(使用Scala闭包可能很诱人)。其中一个风险是意外地在Actor之间共享可变状态,并且这种对Actor模型的违反不幸地破坏了使Actor在编程中进行编程的所有属性。
  4. 顶级Actor是你的Error Kernel的最内层部分,因此请谨慎创建它们并且更应用真正的分层系统。这有利于故障处理(既考虑配置的粒度和性能),也减少了监护人的压力,如果过度使用,这是一个单一的争用点。

你不应该关心的是什么

actor系统管理她所配置的资源,以便运行它包含的actor。在一个这样的系统中可能有数百万的Actor,当然,应用程序作者无法控制在大型系统中处理消息的确切顺序,这也不是可以预期的。退后一步,放松,让Akka在引擎盖下进行繁重的操作。

停止ActorSystem

当您知道应用程序的所有内容都已完成时,您可以调用ActorSystem的terminate方法。这将阻止监护Actor,又会递归地停止其所有的子Actor 。

如果要在终止ActorSystem时执行某些操作,请查看CoordinatedShutdown

下节再续!

原文:https://doc.akka.io/docs/akka/2.5/guide/tutorial_5.html

 

© 著作权归作者所有

共有 人打赏支持
woshixin
粉丝 25
博文 273
码字总数 228209
作品 0
杭州
程序员
私信 提问
Scala 技术周刊 | 第 24 期

这里有最新的 Scala 社区动态、技术博文。 微信搜索 「scalacool」关注我们,及时获取最新资讯。 深度阅读 Resolve me, Implicitly 依赖注入 Refined types, what are they good for? 让类型...

ScalaCool
2017/10/23
0
0
Akka的类库和模块《six》译

在深入研究编写Actor的一些最佳实践之前,先预览一下最常用的Akka库会很有帮助。这将帮助您开始考虑要在系统中使用的功能。所有核心Akka功能都可以作为开源软件(OSS)使用。Lightbend赞助了...

woshixin
08/07
0
0
Akka的Actor层级结构《seven》译

示例简介 在写散文时,最难的部分往往是编写前几句话。在开始构建Akka系统时,有一种类似的“空白画布”的感觉。你可能想知道:哪个应该是第一个Actor?它应该住在哪里?它该怎么办?幸运的是...

woshixin
08/16
0
0
Scala 技术周刊 | 第 22 期

这里有最新的 Scala 社区动态、技术博文。 微信搜索 「scalacool」关注我们,及时获取最新资讯。 深度阅读 Status of the Collections Scala 集合重构进展 Akka 系列(十):Akka 集群之 Ak...

ScalaCool
2017/09/22
0
0
Akka定义Actors和消息《two》译

Akka定义Actors和消息 消息(Messages)可以是任意类型(任何Any的子类)。您可以发送装箱的原始值(例如String, Integer, Boolean等)作为消息以及诸如数组和集合类型等普通数据结构。Case类和C...

woshixin
07/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

图片无限轮播

<!doctype html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, max......

shawnDream
14分钟前
1
0
js 在==时,则会有一些让人难以理解的陷阱

在==时,则会有一些让人难以理解的陷阱。 (function () { var undefined; undefined == null; // true 1 == true; //true 2 == true; // false 0 == false; // true 0 == ''; // true NaN ==......

之渊
16分钟前
2
0
前后端分离之JWT用户认证

参考资料 1、前后端分离之JWT用户认证

哎小艾
20分钟前
1
0
TiDB 在量化派风控系统中的应用

作者:朱劲松,量化派研发中心系统架构师,主要参与了基础组件开发、API Gateway 等项目,现在致力于公司风控系统相关业务的架构设计和研发。 一、公司简介 量化派(QuantGroup)创办于 2014...

TiDB
23分钟前
1
0
Spring Cloud Feign 异常处理

问题 最近在项目开发中,使用 Feign 调用服务,当触发熔断机制时,遇到了以下问题: 异常信息形如:TestService#addRecord(ParamVO) failed and no fallback available.; 获取不到服务提供方...

xiaomin0322
35分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部